<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:rawvoice="http://www.rawvoice.com/rawvoiceRssModule/"
>

<channel>
	<title>Solution Hacker &#187; streaming</title>
	<atom:link href="http://www.solutionhacker.com/tag/streaming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.solutionhacker.com</link>
	<description>This blog provides solutions for enterpreneurs!</description>
	<lastBuildDate>Mon, 06 Feb 2012 07:19:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=495</generator>
<!-- podcast_generator="Blubrry PowerPress/2.0.4" -->
	<itunes:summary>This blog provides solutions for enterpreneurs!</itunes:summary>
	<itunes:author>Solution Hacker</itunes:author>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://www.solutionhacker.com/wp-content/plugins/powerpress/itunes_default.jpg" />
	<itunes:subtitle>This blog provides solutions for enterpreneurs!</itunes:subtitle>
	<image>
		<title>Solution Hacker &#187; streaming</title>
		<url>http://www.solutionhacker.com/wp-content/plugins/powerpress/rss_default.jpg</url>
		<link>http://www.solutionhacker.com</link>
	</image>
		<item>
		<title>Streaming data to your grid</title>
		<link>http://www.solutionhacker.com/uncategorized/streaming-data-to-your-grid/</link>
		<comments>http://www.solutionhacker.com/uncategorized/streaming-data-to-your-grid/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 00:00:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[6. Uncategorized]]></category>
		<category><![CDATA[Scale]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[liberator]]></category>
		<category><![CDATA[NIO]]></category>
		<category><![CDATA[push]]></category>
		<category><![CDATA[streaming]]></category>
		<category><![CDATA[thread]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://www.solutionhacker.com/?p=206</guid>
		<description><![CDATA[<h2>Push data to client</h2>
<p>Traditional web application is based on <strong>request and response model</strong> that information is delivered as a single payload and then immediately close the connection to the client. To keep the client in sync, we normally <strong>pull </strong>the server periodically. This approach may generate unacceptable load to the server. To solve this problem, we want to have a <strong>push </strong>mechanism from server to client. This is why <strong>Comet </strong>is defined. Comet is a generic term describing various approaches to send data asynchronously from a Web server to a client without the need for the client to explicitly request the data. It is an essential technique for any real-time event-driven web applications, where the majority of events occur on the server and data must be "pushed" frequently to the client. To achieve this, Comet servers must maintain <strong>a continuous connection</strong> to each client for the duration of the session.</p>
<div style="page-break-after: always;"><span style="display: none;">&#160;</span></div>
<p>OK. How to maintain <strong>a continuous connection</strong> to each client for the duration of the session?</p>
<blockquote>
<p>If you try to adapt traditional server to the Comet methodology, it may not scale and often fails after a few thousand simultaneously open connections. A true Comet implementation requires a very different kind of server architecture to be efficient and scalable - <a href="http://www.freeliberator.com/comet/">Liberator</a> <em>(a solid Comet server that are used by the financial industries. However, it is written in C and not open source although it has FREE edition distributed). </em></p>
</blockquote>
<p>To understand this statement a little bit more, we need to know how traditional web containers handle the request. They are under <strong>one request per thread </strong>model.</p>
<ol>
    <li>The client , typically , a browser sends request for resource to a web server.</li>
    <li>The server has <strong>a listening thread</strong> that keeps track of incoming connections.</li>
    <li>When a request arrives , the server uses one process or <strong>thread</strong> to process the request.</li>
    <li>The resource is returned to the client and the connection is closed.</li>
</ol>
<p>In this model, the number of requests that can be served in a second would depend on two things</p>
<ol>
    <li>How many threads are there to handle the client requests</li>
    <li>How long it takes to serve one request.</li>
</ol>
<p>If all threads of server are busy, then the incoming requests are <strong>put in a queue</strong>. The server would return to the requests in queue when server threads become free. The number of requests handled per second is always greater than the number of allowed simultaneous connections. All this is made possible because the time required to process a request is very short. In other words you can server more requests in a second than you have threads.</p>
<p>However, there are one breed of applications that need to <strong>hold onto the connections</strong>. Think of applications that require real time data coming to clients (stock tickers)&#160; or think of applications where low-latency is required. In the above traditional web model, the browser has to re-connect to get the new data. (Polling). If the new updates "can"&#160; happen with high frequency (e.g. a chat application) then the polling frequency also has to increase .&#160; An alternative to high frequency polling is to use <strong>push based applications</strong>. For push based application, once the browser connects to server, the server will maintain the connection till the browser time-out (<strong>server response stream is not closed</strong>) and keeps flushing data down the connection as and when they become available. In servlet container, to hold the connection, your thread in the <strong>service </strong>method cannot exit the method. Otherwise, the response stream will be closed. So what you do is, you block the thread on some condition within the service method. So the thread will block for your condition. When push data becomes available , this thread writes to response stream and again enters a blocked state. So as long as you hold onto the connection, you can not return this thread to the thread pool. And as more and more "push" connections are established you would run out of threads! To remedy the problem, the possible solutions are:</p>
<ol>
    <li>Increase # of server threads.</li>
</ol>
<h2>Flex Push</h2>
<p>There is confusion that whether <strong>BlazeDS</strong> supports real time messaging. Yes it does <img onclick="grin(':wink:');" alt=":wink:" src="../../../../../wp-includes/images/smilies/icon_wink.gif" />. In fact, BlazeDS has a full spectrum of channel types ranging from <strong>simple polling</strong>, to <strong>near-real-time polling,</strong> to <strong>real-time streaming</strong>.</p>
<ol>
    <li><strong>Simple polling</strong> - ping the server from Flex client using the traditional request and response model</li>
    <li><strong>Near-real-time polling</strong> (long polling) - Instead of acknowledging right away, the server could hold the polling request until there’s a message for the client. This ensure the messages are delivered to the client as soon as they become available. The caveat for using long-polling is the <strong>thread limitation</strong> in most application servers. At this moment, BlazeDS could not support more than a few hundred long-polling clients on most application servers. However, this problem could be resolved once servers like Tomcat start to support asynchronos, non-blocking connection threads. <span style="color: rgb(255, 0, 0);">Update: Now Tomcat 6 supports NIO.</span></li>
    <li><strong>Real-time streaming</strong> - BlazeDS supports real-time message streaming over AMF and HTTP. Unlike long polling, which closes and reopens the connection upon receiving a message, streaming keep the connection open at all times. Streaming suffers from the same thread blocking issue as long polling. A cap must be set so the server is not hang by idle threads.</li>
</ol>
<p>The reason why people are confused is that Adobe doesn't release its proprietary push solution <a href="http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol">RTMP</a> to BlazeDS. So, RTMP isn't available as a channel in the BlazeDS configuration files. BlazeDS lives in a Servlet container and hence constrained by <strong>one-thread-per-connection</strong> limit whereas <strong>LCDS </strong>has NIO-based channels that can scale up to 1000s of requests. On the other hand, BlazeDS has the advantage that it'll work over port 80/443, whereas LCDS will use some port for persistent connections that would require a firewall configuration. Once the servlet that implements BlazeDS is revved to support Comet Events under Tomcat 6, and then <strong>Jetty Continuations</strong>, then the long polling technique will be fine.</p>
<p><em>UPDATE: We are waiting for a solution that supports Comet Events under Tomcat 6. Then BlazeDS can be coupled to the Tomcat NIO HTTP listener and be able to scale as well as any NIO based server software.</em></p>
<p>I have learnt from this <a href="http://www.flexlive.net/?p=102">article </a>that you can create a <strong>channel set </strong>in client side. So Flex can fail-over to other channels until it gets connected or the list is exhausted.</p>
<p>Marc has put an effort to build a better data grid like a spreadsheet in Flex. (check <a href="http://rockonflash.wordpress.com/2007/11/26/flex-datagrid-replacement/">this </a>out)</p>
<h2>Reference</h2>
<p>Here are the references I used for this article</p>
<ol>
    <li><a href="http://jha.rajeev.googlepages.com/web2push">Tuning Apache and Tomcat for Web 2.0 comet application</a></li>
    <li><a title="Performance of Grids for Streaming Data" rel="bookmark" href="http://cometdaily.com/2007/12/21/performance-of-grids-for-streaming-data/">Performance of Grids for Streaming Data</a> - <em>This shows you the performance numbers on various frontend technologies. Again, Flex shows us a good result.</em></li>
    <li><a href="http://cometdaily.com/2008/11/21/are-raining-comets-and-threads/">Are raining comets and threads? - Comet Daily</a></li>
    <li><a href="http://iobound.com/2008/11/comet-nio/">Comet &#38; Java: Threaded Vs Nonblocking IO </a></li>
    <li><a href="http://pero.blogs.aprilmayjune.org/2009/01/22/hadoop-and-linux-kernel-2627-epoll-limits/">JDK 1.6 uses epoll to implement NIO</a></li>
    <li><a href="http://www.scribd.com/doc/2742051/blazeds-devguide">BlazeDS dev guide</a></li>
    <li><a href="http://www.yachtchartersmagazine.com/node/720304">Achieve performance breakthrough using BlazeDS</a> - <em>Farata System put an effort to write its NIO channel that runs on Jetty 7 and receive promising result.</em></li>
</ol>
<p>&#160;</p>]]></description>
			<content:encoded><![CDATA[<h2>Push data to client</h2>
<p>Traditional web application is based on <strong>request and response model</strong> that information is delivered as a single payload and then immediately close the connection to the client. To keep the client in sync, we normally <strong>pull </strong>the server periodically. This approach may generate unacceptable load to the server. To solve this problem, we want to have a <strong>push </strong>mechanism from server to client. This is why <strong>Comet </strong>is defined. Comet is a generic term describing various approaches to send data asynchronously from a Web server to a client without the need for the client to explicitly request the data. It is an essential technique for any real-time event-driven web applications, where the majority of events occur on the server and data must be &#8220;pushed&#8221; frequently to the client. To achieve this, Comet servers must maintain <strong>a continuous connection</strong> to each client for the duration of the session.</p>
<div style="page-break-after: always;"><span style="display: none;">&#160;</span></div>
<p>OK. How to maintain <strong>a continuous connection</strong> to each client for the duration of the session?</p>
<blockquote>
<p>If you try to adapt traditional server to the Comet methodology, it may not scale and often fails after a few thousand simultaneously open connections. A true Comet implementation requires a very different kind of server architecture to be efficient and scalable &#8211; <a href="http://www.freeliberator.com/comet/">Liberator</a> <em>(a solid Comet server that are used by the financial industries. However, it is written in C and not open source although it has FREE edition distributed). </em></p>
</blockquote>
<p>To understand this statement a little bit more, we need to know how traditional web containers handle the request. They are under <strong>one request per thread </strong>model.</p>
<ol>
<li>The client , typically , a browser sends request for resource to a web server.</li>
<li>The server has <strong>a listening thread</strong> that keeps track of incoming connections.</li>
<li>When a request arrives , the server uses one process or <strong>thread</strong> to process the request.</li>
<li>The resource is returned to the client and the connection is closed.</li>
</ol>
<p>In this model, the number of requests that can be served in a second would depend on two things</p>
<ol>
<li>How many threads are there to handle the client requests</li>
<li>How long it takes to serve one request.</li>
</ol>
<p>If all threads of server are busy, then the incoming requests are <strong>put in a queue</strong>. The server would return to the requests in queue when server threads become free. The number of requests handled per second is always greater than the number of allowed simultaneous connections. All this is made possible because the time required to process a request is very short. In other words you can server more requests in a second than you have threads.</p>
<p>However, there are one breed of applications that need to <strong>hold onto the connections</strong>. Think of applications that require real time data coming to clients (stock tickers)&#160; or think of applications where low-latency is required. In the above traditional web model, the browser has to re-connect to get the new data. (Polling). If the new updates &#8220;can&#8221;&#160; happen with high frequency (e.g. a chat application) then the polling frequency also has to increase .&#160; An alternative to high frequency polling is to use <strong>push based applications</strong>. For push based application, once the browser connects to server, the server will maintain the connection till the browser time-out (<strong>server response stream is not closed</strong>) and keeps flushing data down the connection as and when they become available. In servlet container, to hold the connection, your thread in the <strong>service </strong>method cannot exit the method. Otherwise, the response stream will be closed. So what you do is, you block the thread on some condition within the service method. So the thread will block for your condition. When push data becomes available , this thread writes to response stream and again enters a blocked state. So as long as you hold onto the connection, you can not return this thread to the thread pool. And as more and more &#8220;push&#8221; connections are established you would run out of threads! To remedy the problem, the possible solutions are:</p>
<ol>
<li>Increase # of server threads.</li>
</ol>
<h2>Flex Push</h2>
<p>There is confusion that whether <strong>BlazeDS</strong> supports real time messaging. Yes it does <img onclick="grin(':wink:');" alt=":wink:" src="../../../../../wp-includes/images/smilies/icon_wink.gif" />. In fact, BlazeDS has a full spectrum of channel types ranging from <strong>simple polling</strong>, to <strong>near-real-time polling,</strong> to <strong>real-time streaming</strong>.</p>
<ol>
<li><strong>Simple polling</strong> &#8211; ping the server from Flex client using the traditional request and response model</li>
<li><strong>Near-real-time polling</strong> (long polling) &#8211; Instead of acknowledging right away, the server could hold the polling request until there’s a message for the client. This ensure the messages are delivered to the client as soon as they become available. The caveat for using long-polling is the <strong>thread limitation</strong> in most application servers. At this moment, BlazeDS could not support more than a few hundred long-polling clients on most application servers. However, this problem could be resolved once servers like Tomcat start to support asynchronos, non-blocking connection threads. <span style="color: rgb(255, 0, 0);">Update: Now Tomcat 6 supports NIO.</span></li>
<li><strong>Real-time streaming</strong> &#8211; BlazeDS supports real-time message streaming over AMF and HTTP. Unlike long polling, which closes and reopens the connection upon receiving a message, streaming keep the connection open at all times. Streaming suffers from the same thread blocking issue as long polling. A cap must be set so the server is not hang by idle threads.</li>
</ol>
<p>The reason why people are confused is that Adobe doesn&#8217;t release its proprietary push solution <a href="http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol">RTMP</a> to BlazeDS. So, RTMP isn&#8217;t available as a channel in the BlazeDS configuration files. BlazeDS lives in a Servlet container and hence constrained by <strong>one-thread-per-connection</strong> limit whereas <strong>LCDS </strong>has NIO-based channels that can scale up to 1000s of requests. On the other hand, BlazeDS has the advantage that it&#8217;ll work over port 80/443, whereas LCDS will use some port for persistent connections that would require a firewall configuration. Once the servlet that implements BlazeDS is revved to support Comet Events under Tomcat 6, and then <strong>Jetty Continuations</strong>, then the long polling technique will be fine.</p>
<p><em>UPDATE: We are waiting for a solution that supports Comet Events under Tomcat 6. Then BlazeDS can be coupled to the Tomcat NIO HTTP listener and be able to scale as well as any NIO based server software.</em></p>
<p>I have learnt from this <a href="http://www.flexlive.net/?p=102">article </a>that you can create a <strong>channel set </strong>in client side. So Flex can fail-over to other channels until it gets connected or the list is exhausted.</p>
<p>Marc has put an effort to build a better data grid like a spreadsheet in Flex. (check <a href="http://rockonflash.wordpress.com/2007/11/26/flex-datagrid-replacement/">this </a>out)</p>
<h2>Reference</h2>
<p>Here are the references I used for this article</p>
<ol>
<li><a href="http://jha.rajeev.googlepages.com/web2push">Tuning Apache and Tomcat for Web 2.0 comet application</a></li>
<li><a title="Performance of Grids for Streaming Data" rel="bookmark" href="http://cometdaily.com/2007/12/21/performance-of-grids-for-streaming-data/">Performance of Grids for Streaming Data</a> &#8211; <em>This shows you the performance numbers on various frontend technologies. Again, Flex shows us a good result.</em></li>
<li><a href="http://cometdaily.com/2008/11/21/are-raining-comets-and-threads/">Are raining comets and threads? &#8211; Comet Daily</a></li>
<li><a href="http://iobound.com/2008/11/comet-nio/">Comet &amp; Java: Threaded Vs Nonblocking IO </a></li>
<li><a href="http://pero.blogs.aprilmayjune.org/2009/01/22/hadoop-and-linux-kernel-2627-epoll-limits/">JDK 1.6 uses epoll to implement NIO</a></li>
<li><a href="http://www.scribd.com/doc/2742051/blazeds-devguide">BlazeDS dev guide</a></li>
<li><a href="http://www.yachtchartersmagazine.com/node/720304">Achieve performance breakthrough using BlazeDS</a> &#8211; <em>Farata System put an effort to write its NIO channel that runs on Jetty 7 and receive promising result.</em></li>
</ol>
<p>&#160;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solutionhacker.com/uncategorized/streaming-data-to-your-grid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reporting solution!</title>
		<link>http://www.solutionhacker.com/implement-your-idea/build-your-website/reporting-solution/</link>
		<comments>http://www.solutionhacker.com/implement-your-idea/build-your-website/reporting-solution/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 08:24:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Site Building]]></category>
		<category><![CDATA[AMF]]></category>
		<category><![CDATA[iBatis]]></category>
		<category><![CDATA[jasper]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[pdf generation]]></category>
		<category><![CDATA[pentaho]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[streaming]]></category>

		<guid isPermaLink="false">http://www.solutionhacker.com/?p=205</guid>
		<description><![CDATA[<h2>Open source reporting</h2>
<p>My company needs a reporting engine but it doesn't want to go for the expensive commerical ones like <strong>MicroStrategy</strong>. In fact, I don't know why we need to pay so much because there are tools out there for FREE. As usual, I googled the Net and found out two seemingly promising open source reporting solution.</p>
<ol>
    <li><strong>Pentaho </strong>Reporting</li>
    <li><strong>Jasper </strong>Reporting</li>
</ol>
<p>Both of them are bundled with a suite of tools related to <strong>OLAP</strong>, <strong>Data Mining</strong>, <strong>ETL</strong>.. etc. To me, I just want an non-invasive reporting engine that can easily integrate into our architecture. To my dismay, I found out Pentaho doesn't go this route. It basically gives you a reporting server configured. You could build your reports and deploy them following the manual. However, I hardly see a reporting solution that could satisfy all the business requirements without customization. All I expected from Pentaho is a jar file with documents that shows me how to use its api to generate reports in different formats and how to integrate with our database. I have attempted to look into the code and extracted the stuff I want from Pentaho. However, I found out the engine is actually not powerful. To strip out the workflow part, it is basically a simple SQL executor that later on will render the result according to the UI info embedded in the report definition. What is wrong with that?</p>
<p><!--more--></p>
<ol>
    <li>We want to handle <strong>pagination </strong>and <strong>data streaming</strong> as our data volume is huge. In Pentaho, you need to take care these yourself. So, you write your own sql, paginate yourself, stream it yourself if the resultset is huge. Isn't it what we are doing without it? Apart from that, each report in Pentaho needs a report definition. It supports dynamic sql via token replacement. It is primitive as I want it to support control flow because I may decide what tables to join based on the input filters.</li>
    <li>On the UI side, Pentaho helps you to render your result into graph, table...etc. Again, I don't like this UI solution as well. I found that <strong>JFreeChart </strong>is not as powerful as the Flex solution. I am adopting Flex and it gives me much powerful visualization tool. All I want is to ship my Flex app the data from my query's result.</li>
</ol>
<p>How about <strong>Japser</strong>? Pretty much the same but the good thing of Jasper is that it gives you the jar and document of how to use it instead of a reporting server like Pentaho. So, I can use it as report renderer to generate PDF and Excel like other utility libraries I use. So, what is my final solution?</p>
<p>I finally decide to create my own report definition that my Flex UI can take and render out the reporting interface. So, I don't need to create form for each report. Apart from that, in my report definition, I have iBatis SQL template embedded. So, I can leverage its dynamic sql feature that supports control flow logic and the auto result class population. Yes, I still need to handle pagination and streaming myself. But, at least, it already saves up my time. The result object populated will return to Flex via AMF. So, I don't need to marshal and de-marshal it in xml. It saves the processing time and costs less bandwidth. At the end, my solution combines the best in the market:</p>
<ol>
    <li>Powerful reporting widgets provided by Flex</li>
    <li>Fast streaming and RPC protocol - <strong>AMF</strong></li>
    <li>Good dynamic sql generation and mapping tool from <strong>iBatis</strong></li>
    <li>Good reporting rendering tool from Jasper that helps me to do PDF and Excel generation</li>
</ol>
<p>My solution is more flexible. As I can plugin hibernate map if I don't want to write my own sql at all. Apart from that, no UI work is needed to deploy a new report unless my generic reporting interface is not enough.</p>
<p>Later, if I really need the workflow engine provided by Pentaho, I can plug it in. Again, the document provided doesn't give us clear instruction or APIs of how to do it.</p>
<h2>Reference</h2>
<p>Below are references I used to build my solution:</p>
<ol>
    <li><a href="http://Flexible reporting with JasperReports and iBATIS">Flexible reporting with JasperReport and iBatis</a></li>
    <li><a href="http://e-docs.bea.com/kodo/docs41/full/html/ref_guide_dbsetup_lrs.html">How Kodo JPA handles large result set</a> (its <a href="http://edocs.bea.com/kodo/docs41/full/html/ref_guide_optimization.html">optimization</a> guide is good reference even you may not use Kodo)</li>
    <li><a href="http://my.advisor.com/articles.nsf/aid/14753">Process Large Result Sets in Java Web Application</a></li>
    <li><a href="http://www.ahmadsoft.org/articles/stream/presidents.html">Streaming architecture</a></li>
</ol>
<p>&#160;</p>]]></description>
			<content:encoded><![CDATA[<h2>Open source reporting</h2>
<p>My company needs a reporting engine but it doesn&#8217;t want to go for the expensive commerical ones like <strong>MicroStrategy</strong>. In fact, I don&#8217;t know why we need to pay so much because there are tools out there for FREE. As usual, I googled the Net and found out two seemingly promising open source reporting solution.</p>
<ol>
<li><strong>Pentaho </strong>Reporting</li>
<li><strong>Jasper </strong>Reporting</li>
</ol>
<p>Both of them are bundled with a suite of tools related to <strong>OLAP</strong>, <strong>Data Mining</strong>, <strong>ETL</strong>.. etc. To me, I just want an non-invasive reporting engine that can easily integrate into our architecture. To my dismay, I found out Pentaho doesn&#8217;t go this route. It basically gives you a reporting server configured. You could build your reports and deploy them following the manual. However, I hardly see a reporting solution that could satisfy all the business requirements without customization. All I expected from Pentaho is a jar file with documents that shows me how to use its api to generate reports in different formats and how to integrate with our database. I have attempted to look into the code and extracted the stuff I want from Pentaho. However, I found out the engine is actually not powerful. To strip out the workflow part, it is basically a simple SQL executor that later on will render the result according to the UI info embedded in the report definition. What is wrong with that?</p>
<p><span id="more-205"></span></p>
<ol>
<li>We want to handle <strong>pagination </strong>and <strong>data streaming</strong> as our data volume is huge. In Pentaho, you need to take care these yourself. So, you write your own sql, paginate yourself, stream it yourself if the resultset is huge. Isn&#8217;t it what we are doing without it? Apart from that, each report in Pentaho needs a report definition. It supports dynamic sql via token replacement. It is primitive as I want it to support control flow because I may decide what tables to join based on the input filters.</li>
<li>On the UI side, Pentaho helps you to render your result into graph, table&#8230;etc. Again, I don&#8217;t like this UI solution as well. I found that <strong>JFreeChart </strong>is not as powerful as the Flex solution. I am adopting Flex and it gives me much powerful visualization tool. All I want is to ship my Flex app the data from my query&#8217;s result.</li>
</ol>
<p>How about <strong>Japser</strong>? Pretty much the same but the good thing of Jasper is that it gives you the jar and document of how to use it instead of a reporting server like Pentaho. So, I can use it as report renderer to generate PDF and Excel like other utility libraries I use. So, what is my final solution?</p>
<p>I finally decide to create my own report definition that my Flex UI can take and render out the reporting interface. So, I don&#8217;t need to create form for each report. Apart from that, in my report definition, I have iBatis SQL template embedded. So, I can leverage its dynamic sql feature that supports control flow logic and the auto result class population. Yes, I still need to handle pagination and streaming myself. But, at least, it already saves up my time. The result object populated will return to Flex via AMF. So, I don&#8217;t need to marshal and de-marshal it in xml. It saves the processing time and costs less bandwidth. At the end, my solution combines the best in the market:</p>
<ol>
<li>Powerful reporting widgets provided by Flex</li>
<li>Fast streaming and RPC protocol &#8211; <strong>AMF</strong></li>
<li>Good dynamic sql generation and mapping tool from <strong>iBatis</strong></li>
<li>Good reporting rendering tool from Jasper that helps me to do PDF and Excel generation</li>
</ol>
<p>My solution is more flexible. As I can plugin hibernate map if I don&#8217;t want to write my own sql at all. Apart from that, no UI work is needed to deploy a new report unless my generic reporting interface is not enough.</p>
<p>Later, if I really need the workflow engine provided by Pentaho, I can plug it in. Again, the document provided doesn&#8217;t give us clear instruction or APIs of how to do it.</p>
<h2>Reference</h2>
<p>Below are references I used to build my solution:</p>
<ol>
<li><a href="http://Flexible reporting with JasperReports and iBATIS">Flexible reporting with JasperReport and iBatis</a></li>
<li><a href="http://e-docs.bea.com/kodo/docs41/full/html/ref_guide_dbsetup_lrs.html">How Kodo JPA handles large result set</a> (its <a href="http://edocs.bea.com/kodo/docs41/full/html/ref_guide_optimization.html">optimization</a> guide is good reference even you may not use Kodo)</li>
<li><a href="http://my.advisor.com/articles.nsf/aid/14753">Process Large Result Sets in Java Web Application</a></li>
<li><a href="http://www.ahmadsoft.org/articles/stream/presidents.html">Streaming architecture</a></li>
</ol>
<p>&#160;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.solutionhacker.com/implement-your-idea/build-your-website/reporting-solution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

