<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8660827483003058930</id><updated>2011-11-12T22:03:11.333-08:00</updated><category term='Enterprise Software Forums'/><category term='EJB'/><category term='JBoss performance testing'/><category term='Performance Testing'/><category term='Worm Virus'/><category term='Business Rules'/><title type='text'>IT World</title><subtitle type='html'>Blog on new innovative technologies and the world of Opensource</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://inovat.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://inovat.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Titus Rajesh</name><uri>http://www.blogger.com/profile/06027922321833603240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8660827483003058930.post-5292930206953005718</id><published>2007-08-04T09:28:00.001-07:00</published><updated>2007-08-04T09:28:55.230-07:00</updated><title type='text'>AKON</title><content type='html'>&lt;object width="425" height="350"&gt;&lt;param name="movie" value="&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8660827483003058930-5292930206953005718?l=inovat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://inovat.blogspot.com/feeds/5292930206953005718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8660827483003058930&amp;postID=5292930206953005718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/5292930206953005718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/5292930206953005718'/><link rel='alternate' type='text/html' href='http://inovat.blogspot.com/2007/08/akon.html' title='AKON'/><author><name>Titus Rajesh</name><uri>http://www.blogger.com/profile/06027922321833603240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8660827483003058930.post-5261734251796991373</id><published>2007-07-12T21:37:00.000-07:00</published><updated>2007-07-12T21:38:17.659-07:00</updated><title type='text'>Web security gateways meet rising malware threats</title><content type='html'>&lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td class="a4"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;     &lt;tr&gt;&lt;td&gt;&lt;img src="http://searchsecurity.techtarget.com/spacer.gif" height="15" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;     &lt;tr&gt;      &lt;td&gt;                    By Neil Roiter, Senior Technology Editor&lt;br /&gt;       12 Jul 2007 | SearchSecurity.com  &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;&lt;td&gt;&lt;img src="http://searchsecurity.techtarget.com/spacer.gif" height="15" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;     &lt;tr&gt;      &lt;td class="hideToPrint" valign="middle"&gt;                     &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;    &lt;/tbody&gt; &lt;/table&gt;       &lt;p&gt;If your organization is like most, Web security gateways weren't high on your list of antimalware measures until pretty recently. Your attention to incoming Web traffic has focused largely on policy control--HR concerns over employee access to Internet pornography, gambling, etc., and productivity, as users spend disproportionate time shopping online and checking up on their stocks and favorite teams.&lt;/p&gt;        &lt;table align="left" border="0" cellpadding="0" cellspacing="0" width="147"&gt;   &lt;tbody&gt;&lt;tr&gt;   &lt;td width="100%"&gt;    &lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt;     &lt;tbody&gt;&lt;tr&gt;      &lt;td background="/digitalguide/images/Misc/callout_begin_quote.gif"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="20" width="26" /&gt;&lt;/td&gt;      &lt;td&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="1" width="8" /&gt;&lt;/td&gt;      &lt;td background="/digitalguide/images/Misc/callout_top_line.gif"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="20" width="72" /&gt;&lt;/td&gt;      &lt;td background="/digitalguide/images/Misc/callout_top_line.gif"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="20" width="8" /&gt;&lt;/td&gt;      &lt;td background="/digitalguide/images/Misc/callout_top_line.gif"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="20" width="26" /&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;      &lt;td colspan="5" align="center"&gt;       &lt;table border="0" cellpadding="8" cellspacing="0" width="100%"&gt;        &lt;tbody&gt;&lt;tr&gt;         &lt;td class="big" align="center"&gt;          &lt;b&gt;We're getting more work done and better efficiency on our network--speed improved dramatically.&lt;/b&gt;          &lt;br /&gt;&lt;span class="small"&gt;           Michael Dermer,&lt;br /&gt;chief operating officer, Urology San Antonio &lt;/span&gt;         &lt;/td&gt;        &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;      &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;      &lt;td background="/digitalguide/images/Misc/callout_bottom_line.gif"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="20" width="26" /&gt;&lt;/td&gt;      &lt;td background="/digitalguide/images/Misc/callout_bottom_line.gif"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="20" width="8" /&gt;&lt;/td&gt;      &lt;td background="/digitalguide/images/Misc/callout_bottom_line.gif"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="20" width="72" /&gt;&lt;/td&gt;       &lt;td&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="1" width="8" /&gt;&lt;/td&gt;      &lt;td background="/digitalguide/images/Misc/callout_end_quote.gif"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="20" width="26" /&gt;&lt;/td&gt;     &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;   &lt;/td&gt;   &lt;td&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="1" width="7" /&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td colspan="2"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="5" width="1" /&gt;&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt;    &lt;p&gt;Anti-malware largely meant anti-virus and was pretty well controlled by email screening and desktop antivirus. While Web security gateways are attracting increased attention, desktop antivirus vendors are scrambling to reinforce their products with improved heuristics, host-based IPS and application controls. The antivirus vendors are responding to the rapidly shifting threats from email-borne viruses to Web-based malware designed to steal confidential data and identities and take control of corporate computers.&lt;/p&gt;   &lt;p&gt;"What's changed and started the market heating up is Web component of malware," said Peter Firstbrook, a research director at Stamford, Conn.-based Gartner Inc. "Since the first quarter of 2005, Web-borne malware has grown 540%."&lt;/p&gt;   &lt;p&gt;It's easy to see why. Web 2.0 is spawning new business opportunities with little consideration (surprise!) for security. Users who have been conditioned over more than a decade to be wary of suspicious email attachments can be more easily steered to a malicious Web site that can install a bot, Trojan or rootkit without alerting the victim. Criminal motive has replaced adolescent hubris, as the bad guys find profit in identity theft, fraud and stealing sensitive corporate data more lucrative than Internet graffiti or fast-moving worms.&lt;/p&gt;    &lt;p&gt;The problem is as vast as the Internet. A recent year-long Google study led by Niels Provos calle &lt;a href="http://searchsecurity.techtarget.com/originalContent/www.usenix.org/events/hotbots07/tech/full_papers/provos/provos.pdf"&gt;"The Ghost In The Browser Analysis of Web-based Malware,"&lt;/a&gt; found that 450,000 Web sites--at least 10% of those analyzed downloaded malware to unsuspecting users, and another 700,000 were suspect.&lt;/p&gt;   &lt;p&gt;The problem is compounded because legitimate Web sites can be temporarily compromised and turned into drive-by download perpetrators.&lt;/p&gt;   &lt;p&gt;Small wonder that organizations are showing a growing interest in Web security gateways.&lt;/p&gt;   &lt;p&gt;"Our plan is for every entry port in our enterprise have zero day Web protection," said a wide area network program manager who uses Aladdin eSafe Web security gateway to protect the networks of a large aerospace and defense company. "We decided we needed more that URL filtering, which was the standard method of doing things through 2005."&lt;/p&gt;     &lt;p&gt;URL filtering has approached commodity status. Gartner estimates that 75% to 95% of all enterprise networks employ it. Organizations see a quick return in user productivity and freed bandwidth.&lt;/p&gt;   &lt;p&gt;"Unauthorized use of the Internet is totally jamming our pipeline, slowing business systems," said Michael Dermer, chief operating officer of Urology San Antonio, a group practice of 23 physicians and about 150 employees. "Administratively, we were hearing we need more staff and help, but it didn't seem the workload was increasing." Dermer said URL filtering from eSoft made an immediate difference.&lt;/p&gt;   &lt;p&gt;"We saw an overnight change," he said. "We're getting more work done and better efficiency on our network--speed improved dramatically."&lt;/p&gt;        &lt;table align="left" border="0" cellpadding="0" cellspacing="0"&gt;   &lt;tbody&gt;&lt;tr&gt;   &lt;td colspan="2"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="7" width="1" /&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td&gt;    &lt;table align="left" border="0" cellpadding="0" cellspacing="0" width="200"&gt;     &lt;tbody&gt;&lt;tr class="color4"&gt;      &lt;td&gt;       &lt;table border="0" cellpadding="4" cellspacing="1" width="100%"&gt;        &lt;tbody&gt;&lt;tr class="colorback"&gt;&lt;td class="body"&gt;&lt;b&gt;SOA, Web services security hinge on XML gateways:&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;        &lt;tr class="colorSuperLite"&gt;&lt;td class="body"&gt;&lt;a href="http://searchsecurity.techtarget.com/originalContent/0,289142,sid14_gci1248137,00.html"&gt;SOA, Web services security hinge on XML gateways&lt;/a&gt;: XML security gateways could be the missing piece in most SOA deployments, says Tim Bond, a senior security engineer at webMethods Inc.&lt;/td&gt;&lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;      &lt;/td&gt;     &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;   &lt;/td&gt;   &lt;td&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="1" width="7" /&gt;&lt;/td&gt;  &lt;/tr&gt;  &lt;tr&gt;   &lt;td colspan="2"&gt;&lt;img src="http://media.techtarget.com/searchSecurity/images/spacer.gif" height="7" width="1" /&gt;&lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt;     &lt;p&gt;By contrast, Gartner pegs Web security gateway malware filtering at around 15% network coverage, this figure should increase significantly, with most vendors offering some combination of the components that Gartner uses to define the Web security gateway market--URL filtering, Web traffic malware detection and application control (IM, P2P, Skype, etc.). Gartner pegged the total market at about $700 million in 2006 and expects a 20-25% annual increase.&lt;/p&gt;   &lt;p&gt;The Web security gateway market is an interesting mix of appliance and software vendors, each expanding on their primary strengths--URL filtering vendors like Websense and Secure Computing; traditional AV vendors like McAfee, Trend Micro and Sophos; IM control specialists like FaceTime and email security vendors such as IronPort (recently purchased by Cisco) and MessageLabs--by development, acquisition or partnerships. Newer companies like Mi5 and Anchiva suggest room for growth. (Gartner identifies Blue Coat and Secure Computing as market leaders in a June Magic Quadrant report for this newly defined market.)&lt;/p&gt;   &lt;p&gt;Managed Web security gateway services are another option. Although the market is still young, vendors are starting to offer their technology as a service. ScanSafe, the first company to offer antimalware and URL filtering and IM control as pure-play services, actually scans all their customers Web traffic. It OEMs for companies like Postini and AT&amp;T. MessageLabs, which initially sold ScanSafe-based services, now offers managed services based on its own technology.&lt;/p&gt;   &lt;p&gt;Vendors and analysts say this is in large part a replacement market. Since most organizations are already budgeted for URL filtering, it's relatively easy to step up and add value at the web security gateway, either through new products or adding features to existing deployments. The pressure is growing, as the rapid development and deployment of complex malware outstrips the ability of any single technology to protect enterprises.&lt;/p&gt;   &lt;p&gt;"We were proactive. We started seeing more and more alerts coming through as zero day threats," said the aerospace/defense manager, as he monitored feeds from Symantec's DeepSight services. He chose Aladdin because its packet inspection technology offered better zero-day protection than signature-based detection alone, but uses IronPort for email gateway protection. "We don't believe in too many eggs in one basket."&lt;/p&gt;   &lt;p&gt;In fact, while there are compelling arguments for using the same vendor's products on the desktop and at the Web security gateway, best security practice may dictate deploying the widest range of coverage with different solutions.&lt;/p&gt;   &lt;p&gt;"Malware detection is converging. It's all malware. Whether rootkit, adware or spyware, but malware is growing so fast and so diverse and so complex, no one vendor will catch it all," said Gartner's Firstbrook. "It needs to be from a different vendor; it's totally necessary--needs to be from different vendor. Each only knows what they know about."&lt;/p&gt;   &lt;p&gt;In addition to protecting large enterprises, Web Security gateways make some sense for SMBs, which can add a layer of defense without necessarily beefing up security on every desktop. Gateway-based malware protection offers a single point of policy control and management. It's an alternative for companies feeling the pressure to upgrade their desktops to run the latest antimalware software, who can opt instead to wait until the end-of-life cycle runs its natural course. Specialized systems, such as medical devices that can't be updated easily, can be protected at the gateway.&lt;/p&gt;   &lt;p&gt;"From cost perspective, I don't have to upgrade desktops; putting too much software on them affects performance," said Jay Wessel, vice president of technology for the Boston Celtics, who uses Mi5's Webgate. "It's a centralized place in which you can fix things quickly for everyone." That kind of control is important to small IT operations like his.&lt;/p&gt;   &lt;p&gt;"I like things that live in my room better than things I have to put in anybody else's office," Wessel said.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8660827483003058930-5261734251796991373?l=inovat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://inovat.blogspot.com/feeds/5261734251796991373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8660827483003058930&amp;postID=5261734251796991373' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/5261734251796991373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/5261734251796991373'/><link rel='alternate' type='text/html' href='http://inovat.blogspot.com/2007/07/web-security-gateways-meet-rising.html' title='Web security gateways meet rising malware threats'/><author><name>Titus Rajesh</name><uri>http://www.blogger.com/profile/06027922321833603240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8660827483003058930.post-3507058967039226113</id><published>2007-07-12T13:50:00.000-07:00</published><updated>2007-07-12T13:51:09.133-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Worm Virus'/><title type='text'>Hacked By Godzilla - MS32DLL.dll.vbs - wscript.exe</title><content type='html'>This is basically what Hacked by Godzilla - MS32DLL.dll.vbs - VBS.Zodgila do when it execute:&lt;br /&gt;Creates the following files:[DRIVE LETTER]:\MS32DLL.dll.vbs[DRIVE LETTER]:\MS32DLL.dll.vbs[DRIVE LETTER]:\autorun.infNote: %Windir% is a variable that refers to the Windows installation folder. By default, this is C:\Windows (Windows 95/98/Me/XP) or C:\Winnt (Windows NT/2000).&lt;br /&gt;Adds the value:“MS32DLL” = “%Windir%\MS32DLL.dll.vbs” to the registry subkey:HKEY_LOCAL_MACHINE \SOFTWARE \Microsoft \Windows \CurrentVersion \Runso that it runs every time Windows starts.&lt;br /&gt;Adds the value:“Window Title” = “Hacked by[REMOVED]” to the registry subkey:HKEY_CURRENT_USER \Software \Microsoft \Internet Explorer \Mainto modify title in Internet Explorer.&lt;br /&gt;Attempts to copy itself to removable drives and create registry entries every 200 seconds.&lt;br /&gt;Information above was taken from &lt;a href="http://www.symantec.com/enterprise/security_response/writeup.jsp?docid=2006-112416-3424-99&amp;tabid=2"&gt;Symantec website&lt;/a&gt;.&lt;br /&gt;If your computer affected by “Hacked by Godzilla - MS32DLL.dll.vbs” worms:-&lt;br /&gt;Your Internet Explorer title will end with “Hacked by Godzilla”&lt;br /&gt;You might not able to open any of your drive thru double click (you still able to open/explore using right click -&gt; explore)&lt;br /&gt;How to remove “Hacked by Godzilla - MS32DLL.dll.vbs” (VBS.Zodgila) worm?&lt;br /&gt;Open Task Manager ( Right click on your taskbar and click “Task Manager” )&lt;br /&gt;Click on Processes tab and select “wscript.exe” and click “End Process” button. (Remember to remove all wscript.exe)&lt;br /&gt;Go to My Computer, Click on Tools -&gt; Folder Options, click on View tab&lt;br /&gt;Under Advance settings,check “Show Hidden files and folders“,uncheck “Hide extensions for known file types“,uncheck “Hide protected operating system files (Recommended)”and click “OK” button&lt;br /&gt;Go to C:\WINDOWS or C:\WINNT and delete file MS32DLL.dll.vbs&lt;br /&gt;Now go to all your drive in your computer, and delete autorun.inf and MS32DLL.dll.vbs including your USB Drive and Floppy disk. All the autorun.inf and MS32DLL.dll.vbs file is located at the root directory of your drive, ex: c:\MS32DLL.dll.vbs, d:\MS32DLL.dll.vbs …&lt;br /&gt;To access your drive, Go to My Computer, right click on the drive and select “Explore”&lt;br /&gt;Next we are going to clean your registry record. Click Start -&gt; Run, type regedit&lt;br /&gt;Go to HKEY_LOCAL_MACHINE \Software \Microsoft \Windows \Current Version \Run and delete MS32DLL (right click on it and select delete)&lt;br /&gt;Now we are going to disable CD Autorun, Go to HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Cdrom look for Autorun and double click on it and enter 0 as it’s DWORD value&lt;br /&gt;You can skip this steps if you do not wish to disable CD Autorun feature. But Hacked By Godzilla worm spread when CD Autorun is ON.&lt;br /&gt;Go to HKEY_CURRENT_USER \Software \Microsoft \Internet Explorer \Main and delete “Window Title” which has it’s value of “Hacked by Godzilla“&lt;br /&gt;Now go back to My Computer, Click on Tools -&gt; Folder Options, click on View tab&lt;br /&gt;Under Advance settings,uncheck “Show Hidden files and folders“,check “Hide extensions for known file types“,check “Hide protected operating system files (Recommended)”and click “OK” button&lt;br /&gt;Empty your Recycle Bin.&lt;br /&gt;Restart your PC and your PC should be clean from Hacked by Godzilla now&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8660827483003058930-3507058967039226113?l=inovat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://inovat.blogspot.com/feeds/3507058967039226113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8660827483003058930&amp;postID=3507058967039226113' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/3507058967039226113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/3507058967039226113'/><link rel='alternate' type='text/html' href='http://inovat.blogspot.com/2007/07/hacked-by-godzilla-ms32dlldllvbs.html' title='Hacked By Godzilla - MS32DLL.dll.vbs - wscript.exe'/><author><name>Titus Rajesh</name><uri>http://www.blogger.com/profile/06027922321833603240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8660827483003058930.post-6724561539265922423</id><published>2007-07-12T05:15:00.001-07:00</published><updated>2007-07-12T05:15:28.697-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB'/><title type='text'>EJB</title><content type='html'>&lt;h2&gt;EJB&lt;/h2&gt;           &lt;div id="toc1"&gt;&lt;li&gt;&lt;a class="on_page" href="http://www.jetbrains.com/idea/features/java_ejb.html#link0"&gt;EJB 3.0 specific features&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="on_page" href="http://www.jetbrains.com/idea/features/java_ejb.html#link1"&gt;General EJB features&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="on_page" href="http://www.jetbrains.com/idea/features/java_ejb.html#link2"&gt;EJB-aware coding assistance&lt;/a&gt;&lt;/li&gt;&lt;/div&gt;           &lt;div id="toc2"&gt;&lt;li&gt;&lt;a class="on_page" href="http://www.jetbrains.com/idea/features/java_ejb.html#link3"&gt;Powerful EJB-aware refactorings&lt;/a&gt;&lt;/li&gt;&lt;/div&gt;                     &lt;p&gt;IntelliJ IDEA features rich support for EJB development. Supporting EJB specifications from 1.x to 3.0 and             leveraging it through all its features, from coding assistance to refactoring,&lt;br /&gt;IntelliJ IDEA stands for             the weapon of choice for developing EJB applications.         &lt;/p&gt;           &lt;p&gt;IntelliJ IDEA leverages all EJB in the dedicated module type — the EJB Module, which lets you handle             EJB and relevant objects (ejb-jar.xml and other descriptors, EJB security and EJB deployment settings, etc.)             under one functional entity. This simplifies EJB applications development, debugging and deployment.         &lt;/p&gt;          &lt;br /&gt;           &lt;div class="feature"&gt;             &lt;h4 id="link0"&gt;EJB 3.0 specific features&lt;/h4&gt;             &lt;p&gt;IntelliJ IDEA fully supports annotation mechanism for creating EJB, and Interceptors, with automatic code                 generation, completion and dedicated binding editor.             &lt;/p&gt;             &lt;p&gt;EJB persistence support is powered with generating of persistence mapping from entity beans, Hibernate or                 JDBC source and the visual Persistence diagram builder that lets you get the complete picture of how                 your persistence entities relate one to another.             &lt;/p&gt;             &lt;img src="http://www.jetbrains.com/idea/features/screenshots/60/EJB_Persistence_Diagram.gif" alt="EJB Persistence Diagram" /&gt;              &lt;p&gt;Additionally, IntelliJ IDEA supports entity listeners and Embeddable Enterprise Beans.&lt;/p&gt;             &lt;p&gt;For your existing EJB projects (versions 1.x and 2.x), IntelliJ IDEA provides the migration to EJB 3.0                 that includes:             &lt;/p&gt;             &lt;ul class="starlist"&gt;&lt;li&gt;Converting EJB environment access&lt;/li&gt;&lt;li&gt;Rebuilding EJB deployment descriptors&lt;/li&gt;&lt;li&gt;Transforming EJB interfaces&lt;/li&gt;&lt;li&gt;Turning Entity Beans into Container Managed Persistence&lt;/li&gt;&lt;/ul&gt;             &lt;p class="top"&gt;&lt;a href="http://www.jetbrains.com/idea/features/java_ejb.html#content"&gt;to the top&lt;/a&gt;&lt;/p&gt;         &lt;/div&gt;           &lt;div class="feature"&gt;             &lt;h4 id="link1"&gt;General EJB features&lt;/h4&gt;              &lt;p&gt;IntelliJ IDEA eliminates routine work through generating stub code for entity EJB, session EJB, message                 EJB and other EJB types, CMP EJB fields and EJB relationships. Dedicated context editors also help                 modify EJB and their properties.             &lt;/p&gt;             &lt;img src="http://www.jetbrains.com/idea/features/screenshots/60/EJB_session.gif" alt="EJB session" /&gt;              &lt;p&gt;IntelliJ IDEA automatically builds standard EJB deployment packages either in JAR or exploded directory                 format and automatically generates appropriate EJB XML descriptors for all EJB included in the module                 (ejb-jar.xml).             &lt;/p&gt;             &lt;p class="top"&gt;&lt;a href="http://www.jetbrains.com/idea/features/java_ejb.html#content"&gt;to the top&lt;/a&gt;&lt;/p&gt;         &lt;/div&gt;           &lt;div class="feature"&gt;             &lt;h4 id="link2"&gt;EJB-aware coding assistance&lt;/h4&gt;             &lt;p&gt;IntelliJ IDEA leverages code completion for both EJB code and descriptor files and also supports&lt;/p&gt;             &lt;p&gt;EJB error highlighting: IntelliJ IDEA continuously checks your EJB source code for EJB specification                 compliance, so that all possible inconsistencies are immediately detected and highlighted in the editor.             &lt;/p&gt;             &lt;img class="screenshot righted" src="http://www.jetbrains.com/idea/features/screenshots/60/EJB_error.gif" alt="EJB error" /&gt;              &lt;p&gt;EJB intention actions and quick fixes: For most EJB errors detected in your code, IntelliJ IDEA will                 provide you with the ability to automatically correct the erroneous code by showing an intention action                 light bulb in the editor that expands into a list of possible corrections.             &lt;/p&gt;             &lt;p class="top"&gt;&lt;a href="http://www.jetbrains.com/idea/features/java_ejb.html#content"&gt;to the top&lt;/a&gt;&lt;/p&gt;         &lt;/div&gt;           &lt;div class="feature"&gt;             &lt;h4 id="link3"&gt;Powerful EJB-aware refactorings&lt;/h4&gt;             &lt;p&gt;All global refactorings, like Rename, Change Method Signature, etc., are aware of the EJB specification                 and will therefore correct all necessary references in your code so that your EJB structure is not                 broken. Refactorings also apply to all XML descriptors to ensure the total integrity.             &lt;/p&gt;         &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8660827483003058930-6724561539265922423?l=inovat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://inovat.blogspot.com/feeds/6724561539265922423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8660827483003058930&amp;postID=6724561539265922423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/6724561539265922423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/6724561539265922423'/><link rel='alternate' type='text/html' href='http://inovat.blogspot.com/2007/07/ejb.html' title='EJB'/><author><name>Titus Rajesh</name><uri>http://www.blogger.com/profile/06027922321833603240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8660827483003058930.post-5418935725603739702</id><published>2007-07-12T04:42:00.000-07:00</published><updated>2007-07-12T04:43:33.914-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBoss performance testing'/><title type='text'>JBoss performance testing</title><content type='html'>&lt;h2 class="title"&gt;JBoss Remoting Performance Benchmark Report&lt;/h2&gt; &lt;hr /&gt; &lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a name="d0e4"&gt;&lt;/a&gt;1. Overview&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;This performance benchmark report will cover three separate areas of     performance related to &lt;a href="http://labs.jboss.com/portal/jbossremoting/?prjlist=false" target="_top"&gt;JBoss     Remoting&lt;/a&gt;. Section &lt;a href="http://labs.jboss.com/jbossremoting/docs/benchmark/performance_benchmark.html#section-all-transports"&gt;3 (All transports - speed results&lt;/a&gt; will     cover basic performance when making synchronous invocations from a single     client to a server and will include results for (1) all of the JBoss     Remoting transports, (2) two raw Java transports, and (3) two Spring     Remoting transports.&lt;sup&gt;[&lt;a name="d0e14" href="http://labs.jboss.com/jbossremoting/docs/benchmark/performance_benchmark.html#ftn.d0e14"&gt;1&lt;/a&gt;]&lt;/sup&gt; Section &lt;a href="http://labs.jboss.com/jbossremoting/docs/benchmark/performance_benchmark.html#section-all-invocation-types"&gt;4 (All JBoss Remoting transports - all invocation types)&lt;/a&gt; will     cover performance differences among the various JBoss Remoting transports     when making different types of client to server invocations (i.e.     synchronous and asynchronous). Section &lt;a href="http://labs.jboss.com/jbossremoting/docs/benchmark/performance_benchmark.html#section-scalability"&gt;5 (All transports - scalability)&lt;/a&gt; will cover how well the JBoss Remoting     transports, raw Java transports, and Spring Remoting transports scale as     more clients are added.&lt;/p&gt;&lt;p&gt;This report is NOT intended to indicate how fast different     transports are in absolute terms, but to compare speed and scalability of     transports relative to one another. The tests were run on laptops and the     results might not be indicative of performance levels achievable in a     production environment. However, since all tests in each group were run on     the same hardware, using the same environment and test scenario, the     results should be sufficient for side by side comparisons. All the test     result data are included at the end of this report along with instructions     on how to reproduce the test runs in any other environment.&lt;/p&gt;&lt;/div&gt; &lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a name="d0e24"&gt;&lt;/a&gt;2. Terms&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Since there is a limited amount of space within the graphs for full     descriptions of the transports and test scenarios, the abbreviations are     explained here.&lt;/p&gt;&lt;div class="itemizedlist"&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;p&gt;socket_java: JBoss Remoting using the socket transport and         default Java serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;socket_jboss: JBoss Remoting using the socket transport and         JBoss serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;rmi_java: JBoss Remoting using the rmi transport and default         Java serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;rmi_jboss: JBoss Remoting using the rmi transport and JBoss         serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;http_java: JBoss Remoting using the http transport and default         Java serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;http_jboss: JBoss Remoting using the http transport and JBoss         serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;multiplex_java: JBoss Remoting using the multiplex transport and         default Java serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;multiplex_jboss: JBoss Remoting using the multiplex transport         and JBoss serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;raw_socket: uses straight Java Socket API with Java         serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;raw_rmi: uses straight Java RMI API with Java         serialization&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;spring_rmi: Spring Remoting using the Spring rmi         transport&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;spring_http: Spring Remoting using the Spring http         transport&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a name="section-all-transports"&gt;&lt;/a&gt;3. All transports - speed results&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;In the first performance test a single client continuously makes     synchronous invocations on a single server. This test shows how quickly     the transport can make remote invocations when not under load (basically     showing raw data transfer speed). Three test runs were executed for each     transport, and the averages are given in the following graph.&lt;/p&gt;&lt;div&gt;&lt;img src="http://labs.jboss.com/jbossremoting/docs/benchmark/images/all_transport_sync.gif" /&gt;&lt;/div&gt;&lt;p&gt;The graph shows that the JBoss Remoting socket transport with JBoss     Serialization is able to make the largest number of requests per second,     followed by the raw rmi and raw socket transports (which use the Java API     directly and not a remoting framework).&lt;/p&gt;&lt;/div&gt; &lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a name="section-all-invocation-types"&gt;&lt;/a&gt;4. All JBoss Remoting transports - all invocation types&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The second performance test also consists of a single client making     invocations on a single server, but the test runs span two dimensions:     transport and invocation type. The transports exercised in this case are     the JBoss Remoting transports, and the invocation types are the     following:&lt;/p&gt;&lt;div class="itemizedlist"&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;p&gt;Multi-threaded sync: uses 10 threads to make concurrent         synchronous invocations from the client to the server. Is very similar         in load to using 10 individual clients.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Async - client side: uses single threaded client to make         asynchronous invocations from the client to the server. The calling         thread will hand off the invocation to a client side pool of worker         threads that make the actual client to server invocation.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Single threaded sync: uses single threaded client to make         synchronous invocations from the client to the server.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Async - server side: uses single threaded client to make         asynchronous invocations from the client to the server. The calling         thread will make the actual network call to the server, where the         invocation payload will be handed off to a worker thread pool where it         will be picked up for processing.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;The following graph indicates how long it took each JBoss Remoting     transport to make 100,000 client to server invocations for each invocation     type. The lower the time, the faster the combination of transport and     invocation type.&lt;/p&gt;&lt;div&gt;&lt;img src="http://labs.jboss.com/jbossremoting/docs/benchmark/images/all_transports.gif" /&gt;&lt;/div&gt;&lt;p&gt;The results show that the JBoss Remoting socket transport with JBoss     Serialization was the fastest transport over all the different invocation     types.&lt;/p&gt;&lt;/div&gt; &lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a name="section-scalability"&gt;&lt;/a&gt;5. All transports - scalability&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The final performance test is designed to indicate how well the     various transports scale in response to increased load from additional     clients. Each client uses a single thread to make 100,000 synchronous     invocations on the server. The following graphs indicate the total number     of invocations per second processed by the server as it services up to     thirty clients. The numbers are averaged over three runs. For the sake of     readability the results are partitioned by serialization type. &lt;sup&gt;[&lt;a name="d0e102" href="http://labs.jboss.com/jbossremoting/docs/benchmark/performance_benchmark.html#ftn.d0e102"&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;sup&gt;[&lt;a name="d0e105" href="http://labs.jboss.com/jbossremoting/docs/benchmark/performance_benchmark.html#ftn.d0e105"&gt;3&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;&lt;div&gt;&lt;img src="http://labs.jboss.com/jbossremoting/docs/benchmark/images/scale_java_serialization.gif" /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://labs.jboss.com/jbossremoting/docs/benchmark/images/scale_jboss_serialization.gif" /&gt;&lt;/div&gt;&lt;p&gt;Several phenomena may be observed in these graphs.&lt;/p&gt;&lt;div class="orderedlist"&gt;&lt;ol type="1"&gt;&lt;li&gt;&lt;p&gt;Since the cpu is kept at close to 100% utilization in these         tests (except, perhaps, in the case of a small number of clients,         depending on the speed of the hardware), the ideal in scalability         would be for the total number of invocations processed by the server         to remain flat as the number of clients increases, indicating that         there is no overhead cost for additional clients. Nearly every         transport/serialization combination shows the same pattern of an         initial spike (until the cpu is saturated, presumably) followed by a         gentle decline from 10 to 20 clients and a smaller decline from 20 to         30 clients. For example, the performance of the JBoss Remoting socket         transport with Java serialization declines 6.6% from 10 to 20 clients         and 3.2% from 20 to 30 clients. The most significant exception is the         JBoss Remoting transport with JBoss serialization, which remains         nearly flat as the number of clients increases from 5 to 30,         decreasing by only 2.1%.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;When using Java serialization none of the Remoting framework         transports, JBoss or Spring, achieve the performance of the raw socket         and raw rmi transports. However, the JBoss Remoting socket transport         with JBoss serialization outperforms both of the raw transports at 10         clients and beyond.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The JBoss Remoting socket transport with Java serialization and         the Spring rmi transport show almost identical results. The JBoss         Remoting http transport with Java serialization and the Spring http         transport show nearly identical results as well.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Among all of the Remoting framework transports, the JBoss         Remoting socket transport with JBoss serialization is the clear         favorite in these tests.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a name="d0e126"&gt;&lt;/a&gt;6. Test structure&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;All the performance tests run for this report have the same basic     structure and most share the same base code (the most notable exception     being the Spring Remoting http transport, which requires a web container     for server side deployment). All tests have one or more clients, each of     which starts by creating a callback server and then sending the total     number of invocations it intends to make. The server will then create a     call tracker that will manage the test invocations as they come in from     that client, ensuring that all intended invocations are received without     duplicates. The server will also create a client to call back on the     callback server created within that client instance.&lt;/p&gt;&lt;p&gt;Once the client and server have been fully initialized with their     initial configuration data, the client will begin its loop to make test     invocations. The number of test invocations is configurable, but for this     report, the clients each make 100,000 test invocations. The payload size     for each invocation is configurable as well, but for this report will be     approximately 1024 bytes (plus size of payload wrapper for each     transport). The time it takes the client to make all its test invocations     is the main result captured for this report. When the call tracker on the     server side has received all the invocations from its associated client,     it will call back on that client (actually the client's callback server)     and send the number of test invocations it received and number of     duplicate test invocations, if any. This will indicate test run completion     from the client's perspective.&lt;/p&gt;&lt;p&gt;All the transport tests (except the Spring Remoting http transport)     are executed using the JBoss JRunit test framework. This means that each     test run can be executed within ant as a junit task, which will call on a     JRunit test driver which will spawn one or more client test instances and     a server test instance. All configuration information (as seen below) can     be modified within the JBoss Remoting build.xml file and tests can be     executed via running the JBoss Remoting ant script. All the performance     test source code can be found within the     org.jboss.test.remoting.performance package of the JBoss Remoting project.     Everything needed to run all the transport tests are included within the     &lt;a href="http://labs.jboss.com/portal/jbossremoting/?prjlist=false" target="_top"&gt;JBoss     Remoting&lt;/a&gt; project (except a web container, which is needed for the     Spring Remoting http transport tests).&lt;/p&gt;&lt;/div&gt; &lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a name="d0e138"&gt;&lt;/a&gt;7. Testing environment&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a name="d0e141"&gt;&lt;/a&gt;7.1. Speed test and invocation type test&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The first two tests (speed test for all transports and invocation       type tests) were run in the following environment.&lt;/p&gt;&lt;div class="itemizedlist"&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;p&gt;Hardware: Dell Inspiron 8600, Intel Pentium processor 1.69GHz,           2GB RAM&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Operating System: Microsoft Windows XP Professional (Version           2002, Service Pack 2)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Java Virtual Machine: Sun, Java HotSpot(TM) Client VM (build           1.5.0_03-b07, mixed mode, sharing)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Software:&lt;/p&gt;&lt;div class="itemizedlist"&gt;&lt;ul type="circle"&gt;&lt;li&gt;&lt;p&gt;JBoss Remoting 2.0.0.GA&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Spring 1.2.8&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tomcat 5.5.17 (for Spring Remoting http transport               tests)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Test script configuration:&lt;/p&gt;&lt;div class="itemizedlist"&gt;&lt;ul type="circle"&gt;&lt;li&gt;&lt;p&gt;numofcalls = 100000&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;payloadsize = 1024&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;numofclients = 1&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h3 class="title"&gt;&lt;a name="d0e182"&gt;&lt;/a&gt;7.2. Scalability test&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The third test (scalability) was run in the following       environment.&lt;/p&gt;&lt;div class="itemizedlist"&gt;&lt;ul type="disc"&gt;&lt;li&gt;&lt;p&gt;Hardware: Dell Inspiron 9400, Intel Core Duo T2400 processor           1.83GHz, 2GB RAM&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Operating System: Microsoft Windows XP Professional (Version           2002, Service Pack 2)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Java Virtual Machine: Sun, Java HotSpot(TM) Client VM (build           1.5.0_06-b05, mixed mode, sharing)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Software:&lt;/p&gt;&lt;div class="itemizedlist"&gt;&lt;ul type="circle"&gt;&lt;li&gt;&lt;p&gt;JBoss Remoting 2.0.0.GA&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Spring 1.2.8&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Tomcat 5.5.17 (for Spring Remoting http transport               tests)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Test script configuration:&lt;/p&gt;&lt;div class="itemizedlist"&gt;&lt;ul type="circle"&gt;&lt;li&gt;&lt;p&gt;numofcalls = 100000&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;payloadsize = 1024&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;numofclients = 1, 5, 10, 20, 30&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="section" lang="en"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h2 class="title" style="clear: both;"&gt;&lt;a name="d0e223"&gt;&lt;/a&gt;8. Test result data&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The test result data including all the junit result files (in xml     format) and the MS Excel spreadsheet used to capture raw result data,     calculate averages, and generate graphs can be found within &lt;a href="http://labs.jboss.com/portal/jbossremoting/docs/benchmark/test_results.zip" target="_top"&gt;test_results.zip&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt; &lt;div class="footnotes"&gt;&lt;br /&gt;&lt;hr align="left" width="100"&gt;&lt;div class="footnote"&gt;&lt;p&gt;&lt;sup&gt;[&lt;a name="ftn.d0e14" href="http://labs.jboss.com/jbossremoting/docs/benchmark/performance_benchmark.html#d0e14"&gt;1&lt;/a&gt;] &lt;/sup&gt;It was not possible to test the Spring Remoting hessian and         burlap transports as the versions shipped with 1.2.8 of Spring do not         support sending of Externalizable objects, which is what the test         payload object implements.&lt;/p&gt;&lt;/div&gt;&lt;div class="footnote"&gt;&lt;p&gt;&lt;sup&gt;[&lt;a name="ftn.d0e102" href="http://labs.jboss.com/jbossremoting/docs/benchmark/performance_benchmark.html#d0e102"&gt;2&lt;/a&gt;] &lt;/sup&gt;The raw_rmi and raw_socket transports use only Java         serialization. They are included in the JBoss serialization table to         aid in comparison.&lt;/p&gt;&lt;/div&gt;&lt;div class="footnote"&gt;&lt;p&gt;&lt;sup&gt;[&lt;a name="ftn.d0e105" href="http://labs.jboss.com/jbossremoting/docs/benchmark/performance_benchmark.html#d0e105"&gt;3&lt;/a&gt;] &lt;/sup&gt;The spring transports use only Java serialization. They are         included in the JBoss serialization table to aid in comparison.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;            &lt;table border="0" cellpadding="0" cellspacing="0"&gt;            &lt;tbody&gt;&lt;tr&gt;             &lt;td class="orgprojectdetail-innerleft"&gt;                           &lt;br /&gt;&lt;/td&gt;                          &lt;td class="orgprojectdetail-right"&gt;               &lt;div id="right"&gt;&lt;div class="portlet-container"&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="portlet-titlebar-left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="portlet-titlebar-center"&gt;&lt;span class="portlet-titlebar-title"&gt;JBoss Remoting Downloads&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8660827483003058930-5418935725603739702?l=inovat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://inovat.blogspot.com/feeds/5418935725603739702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8660827483003058930&amp;postID=5418935725603739702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/5418935725603739702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/5418935725603739702'/><link rel='alternate' type='text/html' href='http://inovat.blogspot.com/2007/07/jboss-performance-testing.html' title='JBoss performance testing'/><author><name>Titus Rajesh</name><uri>http://www.blogger.com/profile/06027922321833603240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8660827483003058930.post-823914082215876365</id><published>2007-07-11T20:35:00.000-07:00</published><updated>2007-07-11T20:40:33.109-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Rules'/><title type='text'>Business Rule Engine</title><content type='html'>&lt;div class="pagetitle2"&gt;Article&lt;/div&gt;  &lt;div class="smallpagetitle"&gt;&lt;h1&gt;Getting Started With the Java Rule Engine API (JSR 94): Toward Rule-Based Applications&lt;/h1&gt;&lt;/div&gt;  &lt;!-- END PAGETITLE --&gt;     &lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="1" width="10" /&gt;&lt;/td&gt; &lt;td&gt;&lt;span class="sp10"&gt; &lt;/span&gt;&lt;br /&gt;&lt;!-- MAIN CONTENT --&gt; &lt;!-- ============ --&gt; &lt;a name="skip2content"&gt;&lt;/a&gt; &lt;!--  BEGIN VCD4 PFV  --&gt; &lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td class="smaller" valign="top"&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;/td&gt; &lt;td width="10"&gt; &lt;/td&gt; &lt;td align="right" valign="bottom"&gt;&lt;div class="sitelinks" style="padding: 0px;"&gt; &lt;table border="0" cellpadding="0" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td align="right" valign="bottom"&gt; &lt;/td&gt; &lt;td class="smaller" nowrap="nowrap" valign="bottom"&gt;&lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;!--  END VCD4 PFV --&gt; &lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td class="smaller" valign="top"&gt;&lt;em&gt; By &lt;a href="http://java.sun.com/features/authors.html#mahmoud"&gt;Qusay H. Mahmoud&lt;/a&gt;, July 26, 2005 &lt;/em&gt;&lt;/td&gt; &lt;td width="10"&gt; &lt;/td&gt; &lt;td align="right" valign="bottom"&gt; &lt;div class="sitelinks" style="padding: 0px;"&gt; &lt;table border="0" cellpadding="0" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;!-- &lt;td valign="bottom" align="right"&gt;&lt;img src="/im/ic_email.gif" width="14" height="12" border="0" hspace="4" vspace="1" alt=" " /&gt;&lt;/td&gt; &lt;td valign="bottom" class="smaller" nowrap="nowrap"&gt;&lt;a href="#{link placeholder}"&gt;E-mail&lt;/a&gt;&lt;/td&gt; &lt;td&gt;  &lt;/td&gt; &lt;td valign="bottom" align="right"&gt; &lt;/td&gt; &lt;td valign="bottom" class="smaller" nowrap="nowrap"&gt;&lt;a href="/jsp_utils/PrintPage.jsp" target="printFriendlyView" onclick="openPopup('','printFriendlyView',710,650,'no',1,1,0,0,0,0); return true;"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;  &lt;/td&gt; &lt;td valign="bottom" align="right"&gt;&lt;img src="/im/ic_download_thin.gif" width="9" height="14" hspace="4" border="0" alt=" " /&gt;&lt;/td&gt; &lt;td valign="bottom" class="smaller" nowrap="nowrap"&gt;&lt;a href="#{link placeholder}"&gt;Download&lt;/a&gt;&lt;/td&gt; --&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt;            &lt;br /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;div class="contentdivider"&gt;&lt;table class="grey4" border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="4" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;!--  END VCD4 BYLINE AND TOOLS  --&gt; &lt;!-- BEGIN VCD01 Overview --&gt; &lt;!-- BEGIN VCD1 OVERVIEW COMPONENT  --&gt; &lt;div class="padbottom10"&gt;&lt;p&gt; For many mission-critical applications, the process of automating business policies, procedures, and business logic is simply too dynamic to manage effectively as application source code. Using business rules can help you develop more agile applications. &lt;a href="http://www.businessrulesgroup.org/brghome.htm" target="_blank"&gt;The Business Rules Group&lt;/a&gt; defines a &lt;i&gt;business rule&lt;/i&gt; as a statement that defines or constrains some aspect of the business; a business rule is intended to assert business structure or to control or influence the business's behavior. A rule engine evaluates and executes rules, which are expressed as &lt;i&gt;if-then&lt;/i&gt; statements. The power of business rules lies in their ability both to separate knowledge from its implementation logic and to be changed without changing source code. &lt;/p&gt; &lt;p&gt; The specification for the  &lt;a href="http://www.jcp.org/en/jsr/detail?id=94" target="_blank"&gt;Java Rule Engine API (JSR 94)&lt;/a&gt;, developed through the &lt;a href="http://www.jcp.org/" target="_blank"&gt;Java Community Process (JCP)&lt;/a&gt; program, defines a Java runtime API for rule engines by providing a simple API to access a rule engine from a Java Platform, Standard Edition (Java SE, formerly known as J2SE) or a Java Platform, Enterprise Edition (Java EE, formerly known as J2EE) Java technology client. This article provides an overview of JSR 94 and discusses how to fit business rule technology into Java technology applications. Sample code gives a flavor of the effort involved in developing rule-based applications. &lt;/p&gt; &lt;/div&gt;       &lt;!-- END VCD1 OVERVIEW COMPONENT  --&gt; &lt;!-- END VNV4 LEFTNAV  COMPONENT --&gt;       &lt;!-- &lt;span class="sp10"&gt; &lt;/span&gt;&lt;br /&gt; --&gt; &lt;div&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt; &lt;div class="contentdivider"&gt; &lt;table class="grey4" border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="4" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt;Many business applications have to deal with the dynamic changes of market economics. For example, applications for use in the insurance and banking industries must be able to accommodate the inevitable market changes that no one can predict or plan for during design. A solution is to have a rule engine, which is basically a set of tools that enable business analysts and developers to build decision logic based on an organization's data. The rule engine applies rules and actions as defined by end users without affecting how the application runs. The application is built to deal with the rules, which are designed separately. &lt;/p&gt; &lt;p&gt;Examples of rule engines include Drools, Fair Isaac Blaze Advisor, ILOG JRules, and Jess, to name a few. The lack of standards, however, may be a major factor in deterring businesses from using rule-based applications. Most rule engines have proprietary APIs, making them difficult to integrate with applications. If a rule engine is no longer supported and the business decides to adopt another rule engine, most of the application code will need to be rewritten. JSR 94 is an attempt to standardize rule engine implementations for Java technology. The four rule engines mentioned earlier support JSR 94. &lt;/p&gt; &lt;p&gt;JSR 94 provides guidelines for the rule administration and rule runtime APIs, but it defines no guidelines for what language to use to define the rules and actions. Efforts are under way to standardize a common rule language, including the &lt;a href="http://www.ruleml.org/" target="_blank"&gt;Rule Markup Language (RuleML)&lt;/a&gt;. &lt;/p&gt; &lt;!-- &lt;span class="sp10"&gt; &lt;/span&gt;&lt;br /&gt; --&gt; &lt;div&gt;&lt;b&gt;Rule Engines&lt;/b&gt;&lt;/div&gt; &lt;div class="contentdivider"&gt; &lt;table class="grey4" border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="4" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt; The underlying idea of a rule engine is to externalize the business or application logic. A rule engine can be viewed as a sophisticated interpreter of &lt;i&gt;if-then&lt;/i&gt; statements. The &lt;i&gt;if-then&lt;/i&gt; statements are the rules. A rule is composed of two parts, a condition and an action: When the condition is met, the action is executed. The &lt;i&gt;if&lt;/i&gt; portion contains conditions (such as &lt;code&gt;amount &gt;=$100&lt;/code&gt;), and the &lt;i&gt;then&lt;/i&gt; portion contains actions (such as &lt;code&gt;offer discount 5%&lt;/code&gt;). The inputs to a rule engine are a collection of rules called a rule execution set and data objects. The outputs are determined by the inputs and may include the original input data objects with modifications, new data objects, and possible side effects (such as sending email to the customer). &lt;/p&gt; &lt;p&gt;Rule engines should be used for applications with highly dynamic business logic and for applications that allow end users to author business rules. A rule engine is a great tool for efficient decision making because it can make decisions based on thousands of facts quickly, reliably, and repeatedly. &lt;/p&gt; &lt;!-- &lt;span class="sp10"&gt; &lt;/span&gt;&lt;br /&gt; --&gt; &lt;div&gt;&lt;b&gt;The When, Where, and Why of Rule Engines&lt;/b&gt;&lt;/div&gt; &lt;div class="contentdivider"&gt; &lt;table class="grey4" border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="4" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt;Rule engines are used in applications to replace and manage some of the business logic. They are best used in applications where the business logic is too dynamic to be managed at the source code level -- that is, where a change in a business policy needs to be immediately reflected in the application. Applications in domains such as insurance (for example, insurance rating), financial services (loans, fraud detection, claims routing and management), government (application process and tax calculations), telecom customer care and billing (promotions for long distance calls that needs to be integrated into the billing system), ecommerce (personalizing the user's experience), and so on benefit greatly from using rule engines. &lt;/p&gt; &lt;p&gt;Rule-based applications communicate with the rule engine by passing in the set of rules to be executed. Then, the application can inspect the results and either display them to the end user or perform further processing. The rule engine determines when to evaluate each rule based on the input required for the rule as well as the results obtained from the evaluation of previous rules. You do not need to specify the order or the dependencies of the rules. &lt;/p&gt; &lt;p&gt; In a Java EE enterprise application, for example, rules can fit into applications such as the following: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;At the application tier to manage dynamic business logic and  the task flow&lt;/li&gt;&lt;li&gt;At the presentation layer to customize the page flow and work flow, as well as to construct custom pages based on session state&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; Adopting a rule-based approach for your applications has the following advantages: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;Rules that represent policies are easily communicated and understood.&lt;/li&gt;&lt;li&gt;Rules retain a higher level of independence than conventional programming languages.&lt;/li&gt;&lt;li&gt;Rules separate knowledge from its implementation logic.&lt;/li&gt;&lt;li&gt;Rules can be changed without changing source code; thus, there is no need to recompile the application's code.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;These benefits, however, are not without cost. As with any tool, the decision to integrate a rule engine into your application should be based on cost versus benefits. The cost includes the learning curve and the effort involved in building an interface between the application and the rule engine. In addition, different rule engines use different format and syntax for defining rules. Therefore, if an organization decides to move from one rule engine to another, business analysts and developers must learn and understand the operation of yet another tool. &lt;/p&gt; &lt;!-- &lt;span class="sp10"&gt; &lt;/span&gt;&lt;br /&gt; --&gt; &lt;div&gt;&lt;b&gt;JSR 94&lt;/b&gt;&lt;/div&gt; &lt;div class="contentdivider"&gt; &lt;table class="grey4" border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="4" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt; JSR 94 defines a simple API to access a rule engine from a Java SE or Java EE client. It provides APIs to &lt;/p&gt; &lt;ul&gt;&lt;li&gt;Register and unregister rules&lt;/li&gt;&lt;li&gt;Parse rules&lt;/li&gt;&lt;li&gt;Inspect rule metadata&lt;/li&gt;&lt;li&gt;Execute rules&lt;/li&gt;&lt;li&gt;Retrieve results&lt;/li&gt;&lt;li&gt;Filter results&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; Note that JSR 94 does &lt;i&gt;not&lt;/i&gt; standardize the following: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;The rule engine itself&lt;/li&gt;&lt;li&gt;The execution flow for rules&lt;/li&gt;&lt;li&gt;The language used to describe the rules&lt;/li&gt;&lt;li&gt;The deployment mechanism for Java EE technology&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; In other words, it doesn't standardize the semantics of rule execution. &lt;/p&gt; &lt;!-- &lt;span class="sp10"&gt; &lt;/span&gt;&lt;br /&gt; --&gt; &lt;div&gt;&lt;b&gt;JSR 94 Architecture&lt;/b&gt;&lt;/div&gt; &lt;div class="contentdivider"&gt; &lt;table class="grey4" border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="4" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt; The APIs are defined in two main packages: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;b&gt;The Rules Administrator API&lt;/b&gt;: This API, defined in the &lt;code&gt;javax.rules.admin&lt;/code&gt; package, provides classes that can be used to load rules and associated actions as execution sets. A &lt;i&gt;rule execution set&lt;/i&gt; is a collection of rules. Rules can be loaded from external resources such as URIs, an &lt;code&gt;InpuTStream&lt;/code&gt;, an XML &lt;code&gt;Element&lt;/code&gt;, a binary abstract syntax tree, or a &lt;code&gt;Reader&lt;/code&gt;. It also provides methods to register and unregister rule execution sets. This package can also be used to define the permissions on execution sets to provide access authorization.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;The Runtime Client API&lt;/b&gt;: This API, defined in the &lt;code&gt;javax.rules&lt;/code&gt; package, provides classes to be used by clients to run the rules and get results. Only the rules that have been registered using the Rules Administrator API are accessible. This API enables clients to acquire rule sessions and execute rules within that session. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt; The JSR 94 Expert Group made the decision to have two separate packages to reinforce the distinction between (1) executing a rule execution set that an administrator API has previously loaded and registered into the runtime environment and (2) the dynamic loading and execution of external resources (which can be performed only by using the Rules Administrator API). In addition, the separation allows a more fine-grained control of the user population, permitting some users to execute rules but not to administer them. &lt;/p&gt; &lt;p&gt; &lt;b&gt;The Rules Administrator API&lt;/b&gt; &lt;/p&gt; &lt;p&gt; This API uses the &lt;code&gt;RuleServiceProvider&lt;/code&gt; class to get an instance of the &lt;code&gt;RuleAdministrator&lt;/code&gt; interface, which provides methods to register and unregister execution sets. The high-level capabilities of the administrator API are the following: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;It acquires an instance of the &lt;code&gt;RuleAdministrator&lt;/code&gt; interface through the &lt;code&gt;RuleServiceProvider&lt;/code&gt; class&lt;/li&gt;&lt;li&gt;It creates a &lt;code&gt;RuleExecutionSet&lt;/code&gt; from external  serializable or nonserializable resources including &lt;ul&gt;&lt;li&gt;&lt;code&gt;org.w3c.dom.Element&lt;/code&gt; for reading from an XML subdocument&lt;/li&gt;&lt;li&gt;&lt;code&gt;java.io.InputStream&lt;/code&gt; for reading from binary streams&lt;/li&gt;&lt;li&gt;&lt;code&gt;java.lang.Object&lt;/code&gt; for reading from vendor-specific abstract syntax trees&lt;/li&gt;&lt;li&gt;&lt;code&gt;java.io.Reader&lt;/code&gt; for reading from character streams&lt;/li&gt;&lt;li&gt;&lt;code&gt;java.lang.String&lt;/code&gt; for reading from a URI&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;It registers a &lt;code&gt;RuleExecutionSet&lt;/code&gt; object against a  URI for use from the &lt;code&gt;RuleRuntime&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;It unregisters a &lt;code&gt;RuleExecutionSet&lt;/code&gt;object from a  URI so it is no longer accessible from the &lt;code&gt;RuleRuntime&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;It queries the structural metadata of a rule execution set by  retrieving a list of &lt;code&gt;Rule&lt;/code&gt; objects from the  &lt;code&gt;RuleExecutionSet&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;It sets and gets application or vendor specific properties on rule execution set and rules.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;b&gt;The Runtime Client API&lt;/b&gt; &lt;/p&gt; &lt;p&gt;This API provides access to vendor implementations of the Rule Engine API, in a way similar to Java DataBase Connectivity (JDBC) software. Vendors expose their rule engine implementations to clients through the &lt;code&gt;RuleServiceProvider&lt;/code&gt; class. This class provides access to the runtime and administration APIs. The vendor provides a rule service provider URL that uniquely identifies the implementation. All rule service providers should be registered with a &lt;code&gt;RuleServiceProviderManager&lt;/code&gt; object in order to be accessible to clients. &lt;/p&gt; &lt;p&gt; At the heart of this API is the &lt;code&gt;RuleRuntime&lt;/code&gt; interface, which provides methods to allow clients to create a &lt;code&gt;RuleSession&lt;/code&gt; used to run the rules. A rule session is a runtime connection between a client and a rule engine; it is associated with a single rule execution set and may consume rule engine resources, but the rule session must be explicitly released when the client no longer requires the rule session. Thus, the rule session does two things: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;It provides a mechanism to access the list of all the rule execution sets registered with the rule service provider.&lt;/li&gt;&lt;li&gt;It defines the type of the session that client wishes to  establish: stateful or stateless.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;A &lt;code&gt;statelessRuleSession&lt;/code&gt; works on a per-client request basis.&lt;/li&gt;&lt;li&gt;A &lt;code&gt;statefulRuleSession&lt;/code&gt; is a dedicated session in which objects are not lost as long as the session is maintained between the client and the rules engine.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt; The Runtime Client API's high-level capabilities are the following: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;It acquires an instance of a rule engine vendor's  rule service provider through the  &lt;code&gt;RuleServiceManager&lt;/code&gt; class.&lt;/li&gt;&lt;li&gt;It acquires an instance of the &lt;code&gt;RuleRuntime&lt;/code&gt;  interface through the &lt;code&gt;RuleServiceProvider&lt;/code&gt; class.&lt;/li&gt;&lt;li&gt;It creates a &lt;code&gt;RuleSession&lt;/code&gt; through the  &lt;code&gt;RuleRuntime&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;It gets a &lt;code&gt;java.util.List&lt;/code&gt; of registered URIs.&lt;/li&gt;&lt;li&gt;It interacts with an acquired &lt;code&gt;RuleSession&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;It retrieves metadata for a &lt;code&gt;RuleSession&lt;/code&gt; through the &lt;code&gt;RuleExecutionSetMetadata&lt;/code&gt; interface.&lt;/li&gt;&lt;li&gt;It provides an &lt;code&gt;ObjectFilter&lt;/code&gt; interface to filter the  results of executing a &lt;code&gt;RuleExecutionSet&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;It uses &lt;code&gt;Handle&lt;/code&gt; instances to access objects added to a &lt;code&gt;statefulRuleSession&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;!-- &lt;span class="sp10"&gt; &lt;/span&gt;&lt;br /&gt; --&gt; &lt;div&gt;&lt;b&gt;The JSR 94 Reference Implementation&lt;/b&gt;&lt;/div&gt; &lt;div class="contentdivider"&gt; &lt;table class="grey4" border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="4" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt; Because the JSR 94 reference implementation is built as a wrapper over the &lt;a href="http://herzberg.ca.sandia.gov/jess/" target="_blank"&gt;Jess rule engine&lt;/a&gt;, you will need Jess 6.1a3 or later in order to work with the reference implementation. Jess, which stands for Java Expert System Shell, is a rule engine and a scripting environment. Note that Jess is not freeware: It can be licensed for commercial use, and it is available for academic use. The JSR 94 reference implementation license is governed under the Jess license agreement. The Jess language and scripting environment evolved from the &lt;a href="http://www.ghg.net/clips/CLIPS.html" target="_blank"&gt;CLIPS expert system shell&lt;/a&gt;, which was initially developed by NASA. The CLIPS system language syntax and structure are similar to the LISP functional programming language. &lt;/p&gt; &lt;p&gt; To test the JSR 94 reference implementation, do the following: &lt;/p&gt; &lt;ol&gt;&lt;li&gt;Download the &lt;a href="http://jcp.org/aboutJava/communityprocess/final/jsr094/index.html" target="_blank"&gt;JSR 94 reference implementation&lt;/a&gt; and install it by unzipping the archive in a directory of your choice.&lt;/li&gt;&lt;li&gt;Download Jess. Once you unzip the archive, copy the file  &lt;code&gt;jess.jar&lt;/code&gt; from the Jess installation directory to the  &lt;code&gt;lib&lt;/code&gt; directory of your JSR 94 reference implementation  installation.&lt;/li&gt;&lt;li&gt;Change the directory to &lt;code&gt;lib&lt;/code&gt; under your JSR 94  reference implementation installation&lt;/li&gt;&lt;li&gt;Run the sample example using the following command:&lt;br /&gt;&lt;br /&gt;&lt;!-- BEGIN VCD7 CODE SAMPLE COMPONENT  --&gt; &lt;table class="grey4" border="0" cellpadding="10" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;java -jar jsr94-example.jar&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;span class="sp1"&gt; &lt;/span&gt;&lt;br /&gt;&lt;!-- END VCD7 CODE SAMPLE COMPONENT  --&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;If all goes well, you will see output similar to the following. This output was generated by the sample application that we will discuss next. &lt;/p&gt; &lt;!-- BEGIN VCD7 CODE SAMPLE COMPONENT  --&gt; &lt;table class="grey4" border="0" cellpadding="10" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;C:\jsr94-1.0\lib&gt;java -jar jsr94-example.jar&lt;br /&gt;&lt;br /&gt;Administration API&lt;br /&gt;&lt;br /&gt;Acquired RuleAdministrator: org.jcp.jsr94.jess.RuleAdministratorImpl@9304b1&lt;br /&gt;Acquired InputStream to RI tck_res_1.xml: sun.net.www.protocol.jar.JarURLConnect&lt;br /&gt;ion$JarURLInputStream@c17164&lt;br /&gt;Loaded RuleExecutionSet: org.jcp.jsr94.jess.RuleExecutionSetImpl@cd2c3c&lt;br /&gt;Bound RuleExecutionSet to URI: RuleExecutionSet1&lt;br /&gt;&lt;br /&gt;Runtime API&lt;br /&gt;&lt;br /&gt;Acquired RuleRuntime: org.jcp.jsr94.jess.RuleRuntimeImpl@1d99a4d&lt;br /&gt;Got Stateless Rule Session: org.jcp.jsr94.jess.StatelessRuleSessionImpl@7a84e4&lt;br /&gt;Calling rule session with the following data&lt;br /&gt;Customer credit limit input: 5000&lt;br /&gt;Invoice 1 amount: 2000 status: unpaid&lt;br /&gt;Called executeRules on Stateless Rule Session: org.jcp.jsr94.jess.StatelessRuleS&lt;br /&gt;essionImpl@7a84e4&lt;br /&gt;Result of calling executeRules: 2 results.&lt;br /&gt;Customer credit limit result: 3000&lt;br /&gt;Invoice 1 amount: 2000 status: paid&lt;br /&gt;Released Stateless Rule Session.&lt;br /&gt;&lt;br /&gt;Got Stateful Rule Session: org.jcp.jsr94.jess.StatefulRuleSessionImpl@1e51060&lt;br /&gt;Calling rule session with the following data&lt;br /&gt;Customer credit limit input: 3000&lt;br /&gt;Invoice 1 amount: 2000 status: paid&lt;br /&gt;Invoice 2 amount: 1750 status: unpaid&lt;br /&gt;Called addObject on Stateful Rule Session: org.jcp.jsr94.jess.StatefulRuleSessio&lt;br /&gt;nImpl@1e51060&lt;br /&gt;Called executeRules&lt;br /&gt;Result of calling getObjects: 3 results.&lt;br /&gt;Customer credit limit result: 1250&lt;br /&gt;Invoice 1 amount: 2000 status: paid&lt;br /&gt;Invoice 2 amount: 1750 status: paid&lt;br /&gt;Released Stateful Rule Session.&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;span class="sp20"&gt; &lt;/span&gt;&lt;br /&gt;&lt;!-- END VCD7 CODE SAMPLE COMPONENT  --&gt; &lt;!-- &lt;span class="sp10"&gt; &lt;/span&gt;&lt;br /&gt; --&gt; &lt;div&gt;&lt;b&gt;Sample Application&lt;/b&gt;&lt;/div&gt; &lt;div class="contentdivider"&gt; &lt;table class="grey4" border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="4" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt;To get a flavor of the effort involved in using the Java Rule Engine API, Code Sample 1 shows an example that comes with the reference implementation; the output above was generated from this sample application. This example loads a set of rules from an external XML resource file. The source code is fully commented. This example demonstrates the life cycle of developing applications using the Java Rule Engine API, and it shows several usage scenarios. &lt;/p&gt; &lt;p&gt; &lt;b&gt;Code Sample 1: RuleExample.java&lt;/b&gt; &lt;/p&gt; &lt;!-- BEGIN VCD7 CODE SAMPLE COMPONENT  --&gt; &lt;table class="grey4" border="0" cellpadding="10" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;public class RuleExample {&lt;br /&gt;&lt;br /&gt;  // The rule service provider URI as defined by the reference implementation.&lt;br /&gt;&lt;br /&gt;  private static final String RULE_SERVICE_PROVIDER = "org.jcp.jsr94.jess";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  /**&lt;br /&gt;&lt;br /&gt;   * Main entry point.&lt;br /&gt;&lt;br /&gt;   */&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;&lt;br /&gt;     try {&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Load the rule service provider of the reference implementation.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        // Loading this class will automatically register this provider with the&lt;br /&gt;&lt;br /&gt;        // provider manager.&lt;br /&gt;&lt;br /&gt;        Class.forName("org.jcp.jsr94.jess.RuleServiceProviderImpl");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Get the rule service provider from the provider manager.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        RuleServiceProvider serviceProvider =&lt;br /&gt;&lt;br /&gt;            RuleServiceProviderManager.getRuleServiceProvider(RULE_SERVICE_PROVIDER);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Get the rule administrator.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        RuleAdministrator ruleAdministrator = serviceProvider.getRuleAdministrator();&lt;br /&gt;&lt;br /&gt;        System.out.println("\nAdministration API\n");&lt;br /&gt;&lt;br /&gt;        System.out.println("Acquired RuleAdministrator: " + ruleAdministrator);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Get an input stream to a test XML ruleset.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        // This rule execution set is part of the TCK.&lt;br /&gt;&lt;br /&gt;        InputStream inStream =&lt;br /&gt;&lt;br /&gt;            org.jcp.jsr94.tck.model.Customer.class.getResourceAsStream(&lt;br /&gt;&lt;br /&gt;            &lt;b&gt;"/org/jcp/jsr94/tck/tck_res_1.xml"&lt;/b&gt;);&lt;br /&gt;&lt;br /&gt;        System.out.println("Acquired InputStream to RI tck_res_1.xml: " + inStream);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Parse the ruleset from the XML document.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        RuleExecutionSet res1 =&lt;br /&gt;&lt;br /&gt;           ruleAdministrator.getLocalRuleExecutionSetProvider(&lt;br /&gt;&lt;br /&gt;           null).createRuleExecutionSet( inStream, null );&lt;br /&gt;&lt;br /&gt;        inStream.close();&lt;br /&gt;&lt;br /&gt;        System.out.println("Loaded RuleExecutionSet: " + res1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Register the rule execution set.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        String uri = res1.getName();&lt;br /&gt;&lt;br /&gt;        ruleAdministrator.registerRuleExecutionSet(uri, res1, null);&lt;br /&gt;&lt;br /&gt;        System.out.println("Bound RuleExecutionSet to URI: " + uri);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Get a RuleRuntime and invoke the rule engine.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        System.out.println("\nRuntime API\n");&lt;br /&gt;&lt;br /&gt;        RuleRuntime ruleRuntime = serviceProvider.getRuleRuntime();&lt;br /&gt;&lt;br /&gt;        System.out.println("Acquired RuleRuntime: " + ruleRuntime);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Create a statelessRuleSession.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        StatelessRuleSession statelessRuleSession =&lt;br /&gt;&lt;br /&gt;            (StatelessRuleSession) ruleRuntime.createRuleSession(uri,&lt;br /&gt;&lt;br /&gt;             new HashMap(), RuleRuntime.STATELESS_SESSION_TYPE);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        System.out.println("Got Stateless Rule Session: " + statelessRuleSession);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Create a customer as specified by the TCK documentation.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Then call executeRules on the input objects.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        Customer inputCustomer = new Customer("test");&lt;br /&gt;&lt;br /&gt;        inputCustomer.setCreditLimit(5000);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Create an invoice as specified by the TCK documentation.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        Invoice inputInvoice = new Invoice("Invoice 1");&lt;br /&gt;&lt;br /&gt;        inputInvoice.setAmount(2000);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Create an input list.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        List input = new ArrayList();&lt;br /&gt;&lt;br /&gt;        input.add(inputCustomer);&lt;br /&gt;&lt;br /&gt;        input.add(inputInvoice);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Print the input.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        System.out.println("Calling rule session with the following data");&lt;br /&gt;&lt;br /&gt;        System.out.println("Customer credit limit input: " +&lt;br /&gt;&lt;br /&gt;             inputCustomer.getCreditLimit());&lt;br /&gt;&lt;br /&gt;        System.out.println(inputInvoice.getDescription() +&lt;br /&gt;&lt;br /&gt;             " amount: " + inputInvoice.getAmount() +&lt;br /&gt;&lt;br /&gt;             " status: " + inputInvoice.getStatus());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Execute the rules without a filter.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        List results = statelessRuleSession.executeRules(input);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        System.out.println("Called executeRules on Stateless Rule Session: " +&lt;br /&gt;&lt;br /&gt;             statelessRuleSession);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        System.out.println("Result of calling executeRules: " + results.size() +&lt;br /&gt;&lt;br /&gt;             " results.");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Loop over the results.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        Iterator itr = results.iterator();&lt;br /&gt;&lt;br /&gt;        while(itr.hasNext()) {&lt;br /&gt;&lt;br /&gt;           Object obj = itr.next();&lt;br /&gt;&lt;br /&gt;           if (obj instanceof Customer)&lt;br /&gt;&lt;br /&gt;               System.out.println("Customer credit limit result: " +&lt;br /&gt;&lt;br /&gt;                ((Customer) obj).getCreditLimit());&lt;br /&gt;&lt;br /&gt;           if (obj instanceof Invoice)&lt;br /&gt;&lt;br /&gt;               System.out.println(((Invoice) obj).getDescription() +&lt;br /&gt;&lt;br /&gt;               " amount: " + ((Invoice) obj).getAmount() + " status: " +&lt;br /&gt;&lt;br /&gt;               ((Invoice) obj).getStatus());&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Release the session.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        statelessRuleSession.release();&lt;br /&gt;&lt;br /&gt;        System.out.println("Released Stateless Rule Session.");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Create a statefulRuleSession.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        StatefulRuleSession statefulRuleSession =&lt;br /&gt;&lt;br /&gt;            (StatefulRuleSession) ruleRuntime.createRuleSession(uri,&lt;br /&gt;&lt;br /&gt;             new HashMap(), RuleRuntime.STATEFUL_SESSION_TYPE);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        System.out.println("Got Stateful Rule Session: " + statefulRuleSession);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Add another invoice.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        Invoice inputInvoice2 = new Invoice("Invoice 2");&lt;br /&gt;&lt;br /&gt;        inputInvoice2.setAmount(1750);&lt;br /&gt;&lt;br /&gt;        input.add(inputInvoice2);&lt;br /&gt;&lt;br /&gt;        System.out.println("Calling rule session with the following data");&lt;br /&gt;&lt;br /&gt;        System.out.println("Customer credit limit input: " +&lt;br /&gt;&lt;br /&gt;             inputCustomer.getCreditLimit());&lt;br /&gt;&lt;br /&gt;        System.out.println(inputInvoice.getDescription() +&lt;br /&gt;&lt;br /&gt;             " amount: " + inputInvoice.getAmount() +&lt;br /&gt;&lt;br /&gt;             " status: " + inputInvoice.getStatus());&lt;br /&gt;&lt;br /&gt;        System.out.println(inputInvoice2.getDescription() +&lt;br /&gt;&lt;br /&gt;             " amount: " + inputInvoice2.getAmount() +&lt;br /&gt;&lt;br /&gt;             " status: " + inputInvoice2.getStatus());&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Add an object to the statefulRuleSession.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        statefulRuleSession.addObjects(input);&lt;br /&gt;&lt;br /&gt;        System.out.println("Called addObject on Stateful Rule Session: "+&lt;br /&gt;&lt;br /&gt;             statefulRuleSession);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        statefulRuleSession.executeRules();&lt;br /&gt;&lt;br /&gt;        System.out.println("Called executeRules");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Extract the objects from the statefulRuleSession.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        results = statefulRuleSession.getObjects();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        System.out.println("Result of calling getObjects: " + results.size() +&lt;br /&gt;&lt;br /&gt;             " results.");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Loop over the results.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        itr = results.iterator();&lt;br /&gt;&lt;br /&gt;        while(itr.hasNext()) {&lt;br /&gt;&lt;br /&gt;           Object obj = itr.next();&lt;br /&gt;&lt;br /&gt;           if (obj instanceof Customer)&lt;br /&gt;&lt;br /&gt;              System.out.println("Customer credit limit result: " +&lt;br /&gt;&lt;br /&gt;               ((Customer) obj).getCreditLimit());&lt;br /&gt;&lt;br /&gt;           if (obj instanceof Invoice)&lt;br /&gt;&lt;br /&gt;        System.out.println(((Invoice) obj).getDescription() +&lt;br /&gt;&lt;br /&gt;                   " amount: " + ((Invoice) obj).getAmount() +&lt;br /&gt;&lt;br /&gt;                   " status: " + ((Invoice) obj).getStatus());&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        // &lt;b&gt;Release the statefulRuleSession.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        statefulRuleSession.release();&lt;br /&gt;&lt;br /&gt;        System.out.println( "Released Stateful Rule Session." );&lt;br /&gt;&lt;br /&gt;        System.out.println();&lt;br /&gt;&lt;br /&gt;     } catch (NoClassDefFoundError e) {&lt;br /&gt;&lt;br /&gt;        if (e.getMessage().indexOf("JessException") != -1) {&lt;br /&gt;&lt;br /&gt;           System.err.println("Error: The RI Jess could not be found.");&lt;br /&gt;&lt;br /&gt;        } else {&lt;br /&gt;&lt;br /&gt;           System.err.println("Error: " + e.getMessage());&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;     } catch (Exception e) {&lt;br /&gt;&lt;br /&gt;        e.printStackTrace();&lt;br /&gt;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;span class="sp20"&gt; &lt;/span&gt;&lt;br /&gt;&lt;!-- END VCD7 CODE SAMPLE COMPONENT  --&gt; &lt;p&gt;The rules loaded in this example are part of the use cases that come with the JSR 94 Technology Compatibility Kit (TCK). The rules are written in Jess. If you are familiar with a functional programming language such as Lisp or Haskell then the Jess code will be familiar. Note that other rule engines, such as Drools, have adopted XML syntax for describing rules. Code Sample 2 shows the rules file. &lt;/p&gt; &lt;p&gt;The definition of a rule execution set is not within the scope of JSR 94. The implementation given in this file is written for the reference implementation. A rule engine vendor verifying its rule engine should modify this file to match the vendor's specific needs. &lt;/p&gt; &lt;p&gt; This rule execution set  will be invoked by the TCK in  a stateless manner. &lt;/p&gt; &lt;p&gt; The rule execution set must have support for the following business object model: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;code&gt;Customer&lt;/code&gt; class: The &lt;code&gt;Customer&lt;/code&gt; business object is a simple business object that contains a name and credit limit property. The definition of this class can be found in &lt;code&gt;org.jcp.jsr94.tck.model.Customer&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;code&gt;Invoice&lt;/code&gt; class: The &lt;code&gt;Invoice&lt;/code&gt; business object is a simple business object that contains a description, amount, and status property. The definition of this class can be found in &lt;code&gt;org.jcp.jsr94.tck.model.Invoice&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; The rule execution set has the following definition: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;It supports &lt;code&gt;Customer&lt;/code&gt; and &lt;code&gt;Invoice&lt;/code&gt; business objects.&lt;/li&gt;&lt;li&gt;It defines one logical rule.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;b&gt;Rule 1&lt;/b&gt;: If the customer's credit limit is greater than the invoice amount and the status of the invoice is "unpaid," then decrement the credit limit with the invoice amount and set the status of the invoice to "paid." &lt;/p&gt; &lt;p&gt; Note that additional physical rules may be defined to accomplish the requirements mentioned earlier. &lt;/p&gt; &lt;p&gt; The rule execution set has the following semantics. &lt;/p&gt; &lt;p&gt; &lt;b&gt;Input&lt;/b&gt;: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;A customer with a credit limit of 5000.&lt;/li&gt;&lt;li&gt;An invoice with an amount of 2000.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; The rule execution should produce the following &lt;b&gt;output&lt;/b&gt;:  &lt;/p&gt; &lt;ul&gt;&lt;li&gt;The customer's credit limit is 3000.&lt;/li&gt;&lt;li&gt;The status of the invoice is "paid."&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; &lt;b&gt;Code Sample 2: rules.xml&lt;/b&gt; &lt;/p&gt; &lt;!-- BEGIN VCD7 CODE SAMPLE COMPONENT  --&gt; &lt;table class="grey4" border="0" cellpadding="10" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;/*&lt;br /&gt;* J A V A  C O M M U N I T Y  P R O C E S S&lt;br /&gt;*&lt;br /&gt;* J S R  9 4&lt;br /&gt;*&lt;br /&gt;* Technology Compatibility Kit&lt;br /&gt;*&lt;br /&gt;*/&lt;br /&gt;--&gt;&lt;br /&gt;&lt;rule-execution-set&gt;&lt;br /&gt;&lt;br /&gt;  &lt;name&gt;RuleExecutionSet1&lt;/name&gt;&lt;br /&gt;  &lt;description&gt;Stateless RuleExecutionSet for the TCK for Jess&lt;/description&gt;&lt;br /&gt;&lt;br /&gt;  &lt;code&gt;&lt;br /&gt;      (defclass org.jcp.jsr94.tck.model.Customer&lt;br /&gt;          org.jcp.jsr94.tck.model.Customer)&lt;br /&gt;      (defclass org.jcp.jsr94.tck.model.Invoice&lt;br /&gt;          org.jcp.jsr94.tck.model.Invoice)&lt;br /&gt;&lt;br /&gt;      (defrule rule-1&lt;br /&gt;        ?customer &lt;- (org.jcp.jsr94.tck.model.Customer&lt;br /&gt;                           (creditLimit ?limit) (OBJECT ?C))&lt;br /&gt;        ?invoice &lt;- (org.jcp.jsr94.tck.model.Invoice&lt;br /&gt;                           (amount ?amt&amp;:(&gt; ?limit ?amt))&lt;br /&gt;                             (status "unpaid") (OBJECT ?I))&lt;br /&gt;        =&gt;&lt;br /&gt;        (modify ?customer (creditLimit (- ?limit ?amt)))&lt;br /&gt;;         (printout t "The credit limit of the customer is "&lt;br /&gt;;                     (get ?C creditLimit) crlf)&lt;br /&gt;        (modify ?invoice (status paid))&lt;br /&gt;;         (printout t "The status of the invoice is "&lt;br /&gt;;                     (get ?I status) crlf)&lt;br /&gt;      )&lt;br /&gt;&lt;br /&gt;  &lt;/code&gt;&lt;br /&gt;&lt;/rule-execution-set&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;span class="sp20"&gt; &lt;/span&gt;&lt;br /&gt;&lt;!-- END VCD7 CODE SAMPLE COMPONENT  --&gt; &lt;!-- &lt;span class="sp10"&gt; &lt;/span&gt;&lt;br /&gt; --&gt; &lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt; &lt;div class="contentdivider"&gt; &lt;table class="grey4" border="0" cellpadding="0" cellspacing="0" width="100%"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="http://java.sun.com/im/a.gif" alt=" " border="0" height="4" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt;Business rule technology provides a solution to manage dynamic business logic. You can use rule engines in both the application tier to manage dynamic business logic and in the presentation tier to customize the page flow. JSR 94 provides a vendor-neutral Java SE or Java EE interface to access a rule engine. You can create agile enterprise applications by combining Java EE and business rule technology, managing the business behavior outside the source code. &lt;/p&gt; &lt;p&gt;JSR 94 is an attempt to standardize rules engine implementations for Java technology. The specification provides guidelines on how to implement the Runtime Client and Rules Administrator APIs as well as guidelines on how developers can integrate a rules engine into an application by means of an API -- without limiting how rules and actions should be created or what language the developer should use. &lt;/p&gt; &lt;p&gt;As with any tool, the decision to integrate a rule engine into your application should be based on cost versus benefits. But as JSR 94 gains momentum, application servers may start offering JDBC-like support for multiple vendor implementations of the API, just as they provide support for multiple databases. &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8660827483003058930-823914082215876365?l=inovat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://inovat.blogspot.com/feeds/823914082215876365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8660827483003058930&amp;postID=823914082215876365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/823914082215876365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/823914082215876365'/><link rel='alternate' type='text/html' href='http://inovat.blogspot.com/2007/07/business-rule-engine.html' title='Business Rule Engine'/><author><name>Titus Rajesh</name><uri>http://www.blogger.com/profile/06027922321833603240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8660827483003058930.post-1487190200664576214</id><published>2007-07-11T20:27:00.000-07:00</published><updated>2007-07-11T20:31:56.733-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Software Forums'/><title type='text'>Useful Forums from BEA</title><content type='html'>&lt;a href="http://www.bea.com/exec2exec/"&gt;Exec2Exec&lt;/a&gt; for executive IT and line-of-business professionals.&lt;br /&gt;&lt;a href="it2it.bea.com/"&gt;IT2IT&lt;/a&gt; for IT management professionals.&lt;br /&gt;&lt;a href="arch2arch.bea.com"&gt;Arch2Arch&lt;/a&gt; is the program for architects, by architects.&lt;br /&gt;&lt;a href="forums.bea.com/"&gt;Dev2Dev&lt;/a&gt; is the program for developers, by developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8660827483003058930-1487190200664576214?l=inovat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://inovat.blogspot.com/feeds/1487190200664576214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8660827483003058930&amp;postID=1487190200664576214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/1487190200664576214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/1487190200664576214'/><link rel='alternate' type='text/html' href='http://inovat.blogspot.com/2007/07/useful-forums-from-bea.html' title='Useful Forums from BEA'/><author><name>Titus Rajesh</name><uri>http://www.blogger.com/profile/06027922321833603240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8660827483003058930.post-140668428679004873</id><published>2007-07-11T20:12:00.000-07:00</published><updated>2007-07-11T20:17:50.814-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance Testing'/><title type='text'>Designing Performance Testing Metrics into Distributed J2EE Applications</title><content type='html'>&lt;h1&gt;Introduction&lt;/h1&gt;   &lt;p&gt; In ancient computing times, a wise system architect once said, "you can't manage an application you can't monitor." In many cases, documenting the design for a new application, let alone how it might be monitored, is typically beyond the scope of the project. This article describes a reusable mechanism for capturing application-bound, performance statistics for highly distributed J2EE applications. &lt;/p&gt;   &lt;p&gt;Applications essentially need to be engineered to support established service levels (i.e. Service Level Agreements). In some cases, SLA might be very granular, such as, stating the elapsed time expected to persist data related to a person. The architecture depicted in Figure 1 was implemented to handle an Internet order entry, including a self-service feature to allow a customer to update his own profile. &lt;/p&gt;   &lt;center&gt;  &lt;img src="http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Figure1.gif" /&gt;&lt;br /&gt;&lt;br /&gt; &lt;i&gt;Figure 1. Distributed J2EE Architecture&lt;/i&gt; &lt;/center&gt; &lt;br /&gt;  &lt;p&gt;Because of expectations of high order volumes, the application was engineered to provide distributed EJB transactions, which can be pooled and clustered for high availability and scalability. Highly distributed applications not only need to be engineered from a distributed object standpoint, but from a load balancing and clustering perspective, too. The architecture does not reflect load balancing and clustering implementation details. &lt;/p&gt;   &lt;p&gt;This document describes a basic methodology for performance testing the distributed architecture. Essentially, the document describes the design and edits required to collect basic instrumentation/timing estimates for a distributed J2EE application. &lt;/p&gt;  &lt;br /&gt;  &lt;h1&gt;The Distributed Architecture and Time Synchronization&lt;/h1&gt;   &lt;p&gt;The J2EE application relies on five tiers: a Web, EJB, EAI (Enterprise Application Integration), ERP (Enterprise Resource Planning) and DBMS tier. An Internet client makes an HTTP request to the Web tier and forwards the request over RMI/IIOP to the EJB tier. The EJB tier communicates with the SeeBeyond EAI tier using a SeeBeyond MUX e*Way . The EAI tier communicates with the Peoplesoft CRM (Customer Relationship Management) application within the ERP tier using a Peoplesoft adapter. Finally, The CRM application integrates with an Oracle DBMS over SQL*net. &lt;/p&gt;   &lt;p&gt;A key part of any distributed environment is the time server. Within the methodology, instrumentation metrics are collected on the server where the code is executed, so it is important that all machines within the distributed J2EE architecture are time synchronized. Within the IBM AIX UNIX environment, the xntpd daemon sets the internal clock time on a machine. The service is used to synchronize time services with an external machine using the Network Time Protocol (NTP). Typically, there is a time server, which does not necessarily need to be another AIX or UNIX machine, within an organization's network that all machines synchronize with on startup. (In reality, machines with xntpd configured synchronize constantly, not just on startup.) &lt;/p&gt;   &lt;p&gt;Alternatively, a machine can synchronize with an external time server on the Internet. The xntpd daemon defaults to off, so time settings, such as the IP address of the time server to synchronize with, needs to be configured within an ntp.conf file. Since instrumentation metrics are collected at the second or even millisecond levels, discrepancies between machines can lead to spurious performance statistics. &lt;/p&gt;  &lt;br /&gt;  &lt;h1&gt;Object Specification and Instrumentation Behavior&lt;/h1&gt;   &lt;p&gt;The proposed J2EE architecture relies on a number of well-known design patterns, such as the Business Delegate (a.k.a. Proxy), Data Access Object, Model-View-Controller, Session Facade and Transfer Object (a.k.a. Value Object). A transfer object is a serializable class that groups related attributes, forming a composite value. In the architecture, the Transfer or Value Object is used as the return type of a remote business method, such as an Enterprise JavaBean. Fetching multiple attributes through the value or transfer object in one server roundtrip decreases network traffic and minimizes latency and server resource usage. &lt;/p&gt;   &lt;p&gt;Figure 2 depicts the PersonValueObject, which implements IPersonValueObject and Serializable interfaces. The PersonWorkerBean uses a PersonValueObject for containing person and instrumentation attributes. Instrumentation attributes are long values, which contain a timestamp from calling System.currentTimeMillis(). The PersonValueObject also includes accessor methods for all attributes. &lt;/p&gt;    &lt;center&gt;  &lt;img src="http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Figure2.gif" /&gt;&lt;br /&gt;&lt;br /&gt; &lt;i&gt;Figure 2. UML Class Diagram Value Object Specification (a.k.a Transfer Object)&lt;/i&gt; &lt;/center&gt; &lt;br /&gt;  &lt;p&gt;While it is good OO practice to provide accessor methods instead of allowing direct manipulation of instance variables, it also increases overhead by imposing an additional method call. You want accessors to hide the implementation of get and set, and to allow subclasses to change the synchronization of a get or set, but there will be an overhead cost. Value objects can be sub-classed or they may have associations with other Value objects. For example, if requirements dictated that all Value objects in the application needed to be performance tested, refactoring instrumentation operations within a "FrameworkValueObject" would strongly be recommended. In this alternative specification to Figure 2, the PersonValueObject would extend the FrameworkValueObject and implement the IPersonValueObject interface; the IPersonValueObject interface would extend the IFrameworkValueObject interface. However, the operations listed in the IPersonValueObject would be the same as depicted in Figure 2 for either specification. The advantage to using this model is that all value objects would extend the FrameworkValueObject and therefore have instrumentation behavior; however, this is a complex relationship, and while correct from a UML (Unified Modeling Language) perspective, in and of itself would exert a performance cost to the application. &lt;/p&gt;   &lt;p&gt;For value objects that have a direct association with other value objects, those relationships are implemented as class instance variables. UML recommends that for value objects that have an aggregation or composition association with other value objects, those relationships should be implemented as a Collection. A Collection is the root interface in the Java Collection hierarchy. A Collection represents a group of objects, known as its elements. This interface is typically used to pass collections around and manipulate them where maximum generality is desired. For example, a PersonValueObject contains one to many AddressValueObjects or a Collection of AddressValueObjects. However, this relationship is not included in the diagram, because it is not related to capturing timing estimates, but it is important to "real world" applications. &lt;/p&gt;  &lt;br /&gt;  &lt;h1&gt;Instrumentation Data Collection Process&lt;/h1&gt;   &lt;p&gt; The objective of the methodology for this project was: &lt;/p&gt;   &lt;ul&gt; &lt;li&gt;To estimate the total elapsed time to marshal and persist a PersonValueObject within middleware components.&lt;br /&gt;&lt;br /&gt; &lt;/li&gt;&lt;li&gt;To determine which tiers or key processes were the most expensive from a performance perspective and where optimization might be needed.&lt;br /&gt;&lt;br /&gt; &lt;/li&gt;&lt;li&gt;To be able to log timing estimates from multiple tiers in a single log file, which makes performance analysis and reporting simple.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;   &lt;p&gt; Once the value object was wired for collecting instrumentation/timing, instrumentation edits were required in the J2EE and SeeBeyond application code. This required identifying the objects that would set timing estimates into the value object for the tier, and which object would be responsible for getting the estimates and writing them to a log file. The number of places in the code that timing metrics were collected was, in a way, an arbitrary decision. It was determined that the following objects needed to be reworked: &lt;/p&gt;   &lt;ul&gt; &lt;li&gt;PersonWorkerBean on the Web Tier - would be responsible for setting timing attributes (that is, T1 and T6) on the PersonValueObject to determine total time spent marshaling the remote Session EJB from the Web tier, getting all timing estimates from the PersonValueObject and writing them to a single log file.&lt;br /&gt;&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;EJB SessionBean on the EJB Tier - responsible for setting timing estimates (T2 and T5) on the PersonValueObject to determine elapsed time spent on the EJB tier getting a connection to SeeBeyond and parsing the PersonValueObject into a delimited string for SeeBeyond processing.&lt;br /&gt;&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;PersonDAO (Data Access Object) on the EJB Tier - responsible for setting timing estimates (T3 and T4) on the PersonValueObject to determine total time spent on the EAI tier. &lt;/li&gt; &lt;/ul&gt;  &lt;br /&gt; &lt;h1&gt;Architectural Limitations&lt;/h1&gt;   &lt;p&gt;The input for testing the application was generated using Mercury Interactive's LoadRunner via an HTML browser; this discussion, however, is out of scope for this report. Internet/network timing estimates, that is, download time from the HTTP server to the browser, are not collected through the value object; intranet download timing estimates must be imputed by estimating elapsed overall response time through LoadRunner minus PersonValueObject timing estimates collected in the framework_log4j.log. &lt;/p&gt;   &lt;p&gt;The target of the log4j log output can be a file, an OutputStream, a java.io.Writer, a remote log4j server, a remote Unix Syslog daemon, or even an NT event logger, among many others. The performance of the log4j package is also quite good. On an AMD Duron clocked at 800Mhz running JDK 1.3.1, it costs about 5 nanoseconds to determine if a logging statement should be logged or not. Actual logging is also quite fast, ranging from 21 microseconds using the basic configuration. &lt;/p&gt;   &lt;p&gt;It is important to point out that the purpose of the methodology is not memory and CPU application profiling as would be performed by tools such as JProbe from Quest Software or Optimizeit form Borland. The only tools that are engineered for distributed performance monitoring similar to the methology discussed here are PathWAI Dashboard from Candle Corp. and Introscope from Wily Technology. &lt;/p&gt;   &lt;center&gt;  &lt;img src="http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Figure3.gif" /&gt;&lt;br /&gt;&lt;br /&gt; &lt;i&gt;Figure 3. UML Sequence Diagram - Create a PersonValueObject &lt;/i&gt; &lt;/center&gt; &lt;br /&gt;   &lt;p&gt;A successful execution of the application from the Step 1 createPerson on the PersonWorkerBean to Step 23, writing the timing data to a Log4j log file would result in a single row that can be parsed into the following matrix. Timing estimates are collected in milliseconds. The table below is used to depict the elapsed time for processes within the application tiers, which is somewhat an arbitrary decision based on requirements. In effect, various permutations and combinations of processing times can be estimated, as long as the analyst/programmer has a solid understanding of the context of the timestamp captured. For example, 250 represents the total elapsed time marshaling the PersonValueObject from the Web tier through the entire application, whereas, the Incremental Elapsed Time Column is an imputed estimate for processing within tiers. &lt;/p&gt;   &lt;center&gt;  &lt;img src="http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Table1.jpg" /&gt; &lt;/center&gt; &lt;br /&gt;  &lt;h1&gt;Implementation Details&lt;/h1&gt;   &lt;p&gt; &lt;b&gt;Step 1:&lt;/b&gt; Implement instrumentation code edits for the IPersonValueObject Interface for the PersonValueObject Class (see Figure 2). &lt;/p&gt;   &lt;p&gt; &lt;b&gt;Step 2:&lt;/b&gt; Implement instrumentation code edits for the PersonValueObject Class (see Figure 2). &lt;/p&gt;   &lt;p&gt; &lt;b&gt;Step 3:&lt;/b&gt; Instrumentation code edits for the log4j.xml that sets priority level for application logging to the framework_log4j.log file. log4j relies on a configuration file for runtime settings. It also provides an ability to dynamically set the log levels (i.e. DEBUG, INFO, WARN, etc.). &lt;/p&gt;   &lt;pre&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;&lt;br /&gt;&lt;br /&gt;&lt;log4j:configuration&lt;br /&gt;debug="true"&gt;&lt;br /&gt;  &lt;appender name="TEMP"&lt;br /&gt;      class="org.apache.log4j.FileAppender"&gt;&lt;br /&gt;     &lt;param name="File" value="framework_log4j.log"&gt;&lt;br /&gt;     &lt;layout class="org.apache.log4j.PatternLayout"&gt;&lt;br /&gt;       &lt;param name="ConversionPattern" value="%d - %m%n"&gt;&lt;br /&gt;     &lt;/layout&gt;&lt;br /&gt;  &lt;/appender&gt;&lt;br /&gt;  &lt;category name="proofofconcept"&gt;&lt;br /&gt;     &lt;priority value="info"&lt;br /&gt;     &lt;appender-ref ref="TEMP"&gt;&lt;br /&gt;  &lt;/category&gt;&lt;br /&gt;&lt;/log4j:configuration&gt;&lt;br /&gt;&lt;/pre&gt;   &lt;p&gt; &lt;b&gt;Step 4:&lt;/b&gt; Implement instrumentation code edits for the PersonWorkerBean (see Figure 3). The PersonWorkerBean logs the timestamps to the framework_log4j.log file by invoking a log4j.info method on a static reference to the Log4j Logger class. There are really two key classes: the PropertyConfigurator and Logger. The PropertyConfigurator.configure method is used to pass the location of the configuration file. The Logger is used to set the logging messages, the logging level and to identify which classes in the application you want to log errors for. The recommended pattern for extending the Logger class within Log4j is wrapping or creating a reference. It is strongly discouraged that users subclass either the Logger classes. Log4j provides an ability to (dynamically) set the log levels (i.e. DEBUG, INFO, WARN, etc.) or provide the level through a configuration file. By setting the level to "info", all messages of "info" and above will be written to the log file. Provided that the application does not throw any exceptions, there should be only one "info" message written to the file, which includes timing estimates for all middleware tiers. &lt;/p&gt;   &lt;p&gt; &lt;b&gt;Step 5:&lt;/b&gt; Implement instrumentation code edits for the PersonServiceSessionBean (see Figure 3). The PersonSessionBean create method receives a serialized copy of the PersonValueObject, sets the estimate into the PersonValueObject and calls the createPerson on the PersonDAO. In the model, the DAO is used to get a connection to the SeeBeyond EAI application server, and the PersonValueObject is not directly persisted into a DBMS. The point is, that in most J2EE applications, the Data Access Object pattern is used to specify how to persist data into DBMS. &lt;/p&gt;   &lt;p&gt; &lt;b&gt;Step 6:&lt;/b&gt; Implement instrumentation code edits for the PersonDAO class (see Figure 3). The createPerson method on the PersonDAO sends the PersonValueObject to the SeeBeyond application server using a MUX e*Way, a synchronous protocol. For this implementation, the PersonValueObject attributes where sent as a test message, because the SeeBeyond application server only supported text messages. The returning message from SeeBeyond, because it represented a string, not a PersonValueObject, needed to be parsed using a StringTokenizer. This edit for instrumenation code assumes that there are 3 tokens in the order in the format "Id^timeStamp1^timeStamp2." The Id is generated by SeeBeyond and represents the primary key for the PersonValueObject created. &lt;/p&gt;   &lt;p&gt;The SeeBeyond application server provided timestamps for integration with the Peoplesoft CRM. SeeBeyond also returned the generated primary key, which would be required for persisting associated value objects, such as Address value objects. This is not modeled in the UML sequence diagram, because the central theme is how to collect timing estimates within disparate computing tiers. &lt;/p&gt;   &lt;pre&gt;protected IPersonValueObject createValueObject(&lt;br /&gt;   String rs )&lt;br /&gt;   {&lt;br /&gt;       IPersonValueObject valueObject = null;&lt;br /&gt;       try&lt;br /&gt;       {&lt;br /&gt;           valueObject = getPersonValueObject();&lt;br /&gt;           if ( valueObject == null )    // create one&lt;br /&gt;           {&lt;br /&gt;               valueObject = new PersonValueObject();&lt;br /&gt;           }&lt;br /&gt;              StringTokenizer st =&lt;br /&gt;                 new StringTokenizer(rs, "^");&lt;br /&gt;              PersonPrimaryKey pk =&lt;br /&gt;                 new PersonPrimaryKey(st.nextToken());&lt;br /&gt;              valueObject.setPrimaryKey( pk);&lt;br /&gt;              valueObject.setT3( Long.parseLong(st.nextToken()));&lt;br /&gt;              valueObject.setT4( Long.parseLong(st.nextToken()));&lt;br /&gt;                     }&lt;br /&gt;       catch ( Exception exc )&lt;br /&gt;       {&lt;br /&gt;           printMessage("PersonDAO:createValueObject()-" +&lt;br /&gt;                        exc );&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       return( valueObject );&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;   &lt;br /&gt; &lt;h1&gt;Architectural Implications&lt;/h1&gt;   &lt;p&gt;Ideally, the best design would allow for a ValueObject to be passed to all middleware tiers. SeeBeyond on the EAI tier actually has asynchronous support using JMS (Java Messaging Service) text messages, but not for JMS ObjectMessage type messages. Most implementers would prefer ObjectMessage type messages. For example, with an ObjectMessage type using JMS, the PersonValueObject would not have been parsed into a String object, but could have been sent directly to SeeBeyond . ObjectMessages - messages containing a serialized Java object - make it clear to programmers which data type and attribute they are receiving and sending. With support for JMS ObjectMessages, the PersonEAI object depicted in Figure 4 could have been implemented in SeeBeyond, which could have marshaled directly the PersonValueObject. For distributed object programmers, this is what it is all about -- transferring objects around the network. &lt;/p&gt;    &lt;center&gt;  &lt;img src="http://www.theserverside.com/tt/articles/content/PerfTestingMetrics/Figure4.gif" /&gt;&lt;br /&gt;&lt;br /&gt; &lt;i&gt;Figure 4. View of participating classes for UML Sequence Diagram - Create a PersonValueObject&lt;/i&gt; &lt;/center&gt; &lt;br /&gt;  &lt;h2&gt;About the Author&lt;/h2&gt;   &lt;p&gt; Frank is a Lead Architect specializing in J2EE application design and implementation of enterprise-wide applications. He can be reached at &lt;a href="mailto:frank_teti@hotmail.com"&gt;frank_teti@hotmail.com&lt;/a&gt;. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8660827483003058930-140668428679004873?l=inovat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://inovat.blogspot.com/feeds/140668428679004873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8660827483003058930&amp;postID=140668428679004873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/140668428679004873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8660827483003058930/posts/default/140668428679004873'/><link rel='alternate' type='text/html' href='http://inovat.blogspot.com/2007/07/designing-performance-testing-metrics.html' title='Designing Performance Testing Metrics into Distributed J2EE Applications'/><author><name>Titus Rajesh</name><uri>http://www.blogger.com/profile/06027922321833603240</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
