<?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-1304066656993695443</id><updated>2012-01-23T23:26:52.890Z</updated><category term='Oracle Service Bus'/><category term='AOP'/><category term='RPC-Encoded'/><category term='OEM'/><category term='Interoperability'/><category term='dcli'/><category term='Pitchfork'/><category term='Messaging'/><category term='coherence'/><category term='DomainHealth'/><category term='Dependency Injection'/><category term='Hugemem'/><category term='rac'/><category term='exalogic'/><category term='MBean'/><category term='Threads'/><category term='Schema'/><category term='SQLPlus'/><category term='RPC'/><category term='WebLogic'/><category term='Instrumentation'/><category term='Web Services Security'/><category term='JConsole'/><category term='HTTP'/><category term='PAE'/><category term='Watch'/><category term='exadata'/><category term='WSDL'/><category term='JRMC'/><category term='JAX-RPC'/><category term='32-bit'/><category term='OneCommand'/><category term='sun'/><category term='windows'/><category term='Wiley'/><category term='JMS'/><category term='WLDF'/><category term='JAX-WS'/><category term='Spring'/><category term='Engineered Systems Exa Exalogic Exadata SPARC SuperCluster SSC'/><category term='Downloads'/><category term='WLHostMachineStats'/><category term='solaris'/><category term='WLDF Console Extension'/><category term='WSDL-First'/><category term='Docs'/><category term='Heap'/><category term='maximum heap size'/><category term='Document-Literal'/><category term='JVM'/><category term='64-bit'/><category term='REST'/><category term='infiniband'/><category term='Global Type'/><category term='Mission Control'/><category term='Web Services'/><category term='Optimisations'/><category term='PermGen'/><category term='Harvest'/><category term='XML'/><category term='Professional Oracle WebLogic Server'/><category term='flight recorder'/><category term='CRUD'/><category term='Memory Leak'/><category term='Java'/><category term='book'/><category term='oracle'/><category term='Open Source'/><category term='SOAP'/><category term='Dispatch'/><category term='Global Element'/><category term='rlwrap'/><category term='Wrox'/><category term='JMX'/><category term='POWLS'/><category term='Linux'/><category term='WLST'/><category term='WS-I'/><category term='Wrapped'/><category term='SDP'/><category term='JRockit'/><category term='Roles Allowed'/><category term='Postel&apos;s Law'/><category term='Optimizations'/><category term='Monitoring'/><category term='Readline'/><category term='Code-First'/><category term='hotspot'/><category term='replication'/><category term='OSI'/><category term='.NET'/><category term='Provider'/><title type='text'>Paul Done's Technical Blog</title><subtitle type='html'>A blog about engineered hardware/software systems, enterprise Java, web services and middleware technologies</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-6548489211651935896</id><published>2012-01-09T09:54:00.005Z</published><updated>2012-01-09T10:06:24.270Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Engineered Systems Exa Exalogic Exadata SPARC SuperCluster SSC'/><title type='text'>New Exa and Engineered Systems blog to watch</title><content type='html'>Just a quick post to say look out for a new &lt;a href="http://exablurb.blogspot.com/"&gt;technical blog&lt;/a&gt; by my friend and colleague, Donald Forbes. Given Don's expertise, inside track and ready access to real Exa* machines, there should be lots of insightful technical information coming over the next few months, especially on &lt;a href="http://www.oracle.com/us/products/middleware/exalogic/overview/index.html"&gt;Exalogic&lt;/a&gt; and &lt;a href="http://www.oracle.com/us/corporate/features/sparc-supercluster-t4-4-489157.html"&gt;SPARC SuperCluster&lt;/a&gt;, so watch this (that?) space.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;i&gt;Song for today: Slipping Husband by &lt;a href="http://en.wikipedia.org/wiki/The_National_(band)"&gt;The National&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-6548489211651935896?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/6548489211651935896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=6548489211651935896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6548489211651935896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6548489211651935896'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2012/01/new-exa-and-engineered-systems-blog-to.html' title='New Exa and Engineered Systems blog to watch'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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-1304066656993695443.post-6310001488044526649</id><published>2011-10-05T16:30:00.011+01:00</published><updated>2011-10-06T09:35:03.697+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='WLHostMachineStats'/><category scheme='http://www.blogger.com/atom/ns#' term='exalogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainHealth'/><title type='text'>New release of DomainHealth - 1.0</title><content type='html'>I've just released a new version of &lt;a href="http://sourceforge.net/projects/domainhealth"&gt;DomainHealth&lt;/a&gt;, that by virtue of being the next increment after 0.9, means that this is the grand 1.0 release! No great fanfare or massive new features but this should [hopefully] be a nice stable release to rely on and live up to its 1.0 billing!  :D&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can download DomainHealth 1.0 from here: &lt;span&gt;&lt;span&gt;&lt;a href="http://sourceforge.net/projects/domainhealth"&gt;http://sourceforge.net/projects/domainhealth&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One new feature in 1.0 that is worth highlighting though, is the new optional capability to collect and show &lt;b&gt;Processor, Memory and Network statistics&lt;/b&gt; from the underlying &lt;b&gt;host Operating System and Machine&lt;/b&gt; that WebLogic is running on. DomainHealth only enables this feature if you've also deployed another small open source JEE application that I've created, called &lt;b&gt;WLHostMachineStats&lt;/b&gt;. Below is a screenshot of DomainHealth 1.0 in action, displaying graphs of some of these host machine statistics (in this case it's running on an &lt;a href="http://www.oracle.com/us/products/middleware/exalogic/overview"&gt;Exalogic&lt;/a&gt; system).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-lk8u_h8N7qg/Tox0-MYVtdI/AAAAAAAAAHw/YaP0C6JXGhI/s1600/dh_whms_main.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 193px;" src="http://4.bp.blogspot.com/-lk8u_h8N7qg/Tox0-MYVtdI/AAAAAAAAAHw/YaP0C6JXGhI/s320/dh_whms_main.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5660027443521893842" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Verdana, Arial, sans-serif; font-size: 10px; font-weight: normal; line-height: 16px; background-color: rgb(255, 255, 255); "&gt;&lt;b&gt;(click image for larger view)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;WLHostMachineStats&lt;/b&gt; is a small agent (a JMX MBean deployed as a WAR file) that runs in every WebLogic Server in a WebLogic domain. It is used to retrieve OS data from the underlying machine hosting each WebLogic Server instance. For more information, including deployment instructions, and to download it, go to: &lt;a href="http://sourceforge.net/projects/wlhostmchnstats"&gt;http://sourceforge.net/projects/wlhostmchnstats&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's another screenshot, just for fun:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-j-8DHwHkbHA/Tox191jgPMI/AAAAAAAAAH4/6ZA-eiUOb3A/s1600/dh_whms_3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 193px;" src="http://2.bp.blogspot.com/-j-8DHwHkbHA/Tox191jgPMI/AAAAAAAAAH4/6ZA-eiUOb3A/s320/dh_whms_3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5660028536906333378" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Verdana, Arial, sans-serif; font-size: 10px; line-height: 16px; background-color: rgb(255, 255, 255); "&gt;&lt;b&gt;(click image for larger view)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Some things to bear in mind....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...the &lt;b&gt;WLHostMachineStats&lt;/b&gt; project is still in its &lt;b&gt;infancy&lt;/b&gt; and currently places restrictions on what specific environments are supported. Right now, WLHostMachineStats can only be used for WebLogic domains running on&lt;b&gt; Linux Intel (x86) 64-bit&lt;/b&gt; based machines (including Exalogic) and only for versions &lt;b&gt;10.3.0 or greater of WebLogic&lt;/b&gt;. This is partly because WLHostMachineStats relies on the &lt;a href="http://support.hyperic.com/display/SIGAR/Home"&gt;SIGAR&lt;/a&gt; open source utility, that uses native C libraries and JNI. I hope to widen the list of supported platforms for WLHostMachineStats in the future.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Song for today: Dynamite Steps by &lt;a href="http://en.wikipedia.org/wiki/The_Twilight_Singers"&gt;The Twilight Singers&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-6310001488044526649?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/6310001488044526649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=6310001488044526649' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6310001488044526649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6310001488044526649'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2011/10/new-release-of-domainhealth-10.html' title='New release of DomainHealth - 1.0'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-lk8u_h8N7qg/Tox0-MYVtdI/AAAAAAAAAHw/YaP0C6JXGhI/s72-c/dh_whms_main.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-7698078336508102602</id><published>2011-09-02T07:19:00.002+01:00</published><updated>2011-09-02T09:32:54.893+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='exalogic'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainHealth'/><title type='text'>New release of DomainHealth (v0.9.1)</title><content type='html'>I've just released a new version of DomainHealth (version 0.9.1). This is primarily a maintenance/bug-fix release. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;DomainHealth is an open source "zero-config" monitoring tool for WebLogic. It collects important server metrics over time, archives these into CSV files and provides a simple web interface for viewing graphs of current and historical statistics. It also works nicely on Exalogic.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To download (and see release notes) go to the project home (select 'files' menu option) at: &lt;a href="http://sourceforge.net/projects/domainhealth/"&gt;http://sourceforge.net/projects/domainhealth/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For DomainHealth help docs see: &lt;a href="http://sourceforge.net/apps/mediawiki/domainhealth/index.php?title=Main_Page"&gt;http://sourceforge.net/apps/mediawiki/domainhealth/index.php&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Song for today: Ascension Day by &lt;a href="http://en.wikipedia.org/wiki/Talk_Talk"&gt;Talk Talk&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-7698078336508102602?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/7698078336508102602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=7698078336508102602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/7698078336508102602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/7698078336508102602'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2011/09/new-release-of-domainhealth-v091.html' title='New release of DomainHealth (v0.9.1)'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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-1304066656993695443.post-1515874284988609934</id><published>2011-03-03T20:32:00.022Z</published><updated>2011-03-29T23:56:05.009+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dcli'/><category scheme='http://www.blogger.com/atom/ns#' term='exalogic'/><category scheme='http://www.blogger.com/atom/ns#' term='coherence'/><title type='text'>Exalogic DCLI - run commands on all compute nodes at once</title><content type='html'>&lt;p&gt;Exalogic includes a tool called &lt;b&gt;DCLI &lt;/b&gt;(Distributed Command Line Interface) that can be used to run the same commands on all or a subset of compute nodes in parallel. This saves a lot of time and helps avoid the sorts of  silly errors that often occur when running a command over and over again. DCLI is a tool that originally came with Exadata (as documented in the &lt;i&gt;Oracle Exadata Storage Server Software User's Guide - E13861-05 chapter 9&lt;/i&gt;), and is now incorporated into the new Exalogic product too. It is worth noting that if you are ever involved in performing the initial configuration of a new Exalogic rack, using &lt;a href="http://download.oracle.com/docs/cd/E18476_01/doc.220/e18478/app_b.htm"&gt;OneCommand&lt;/a&gt; to configure the Exalogic's networking, then under the covers OneCommand will be using DLCI to perform a lot of its work.&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;b&gt;&lt;u&gt;Introduction to Exalogic's DCLI&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The Oracle Enterprise Linux 5.5 based factory image running on each Exalogic compute node has the &lt;i&gt;exalogic.tools&lt;/i&gt; RPM package installed. This contains the DCLI tool in addition to other useful Exalogic command line utilities. Running '&lt;i&gt;rpm -qi  exalogic.tools&lt;/i&gt;' on a compute node shows the following package information:&lt;/p&gt;&lt;blockquote&gt;&lt;i&gt;  Name        : exalogic.tools&lt;br /&gt;Version     : 1.0.0.0&lt;br /&gt;Release     : 1.0&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;When you run '&lt;i&gt;rpm -ql exalogic.tools&lt;/i&gt;' you will see that the set of command line utilities are all placed in a directory at '&lt;i&gt;/opt/exalogic.tools'. S&lt;/i&gt;pecifically, the DCLI tool is located at '&lt;i&gt;/opt/exalogic.tools/tools/dcli'. &lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div&gt;Running DCLI from the command line with the '-h' argument, will present you with a short help summary of DCLI and the parameters it can be given:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;# &lt;i&gt;/opt/exalogic.tools/tools/dcli -h&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;/i&gt;If you look at the contents of the '&lt;i&gt;/opt/exalogic.tools/tools/dcli'&lt;/i&gt; file you will see that it is actually a Python script that, essentially, determines the list of compute nodes that a supplied command should be applied to and then runs the supplied command on each compute node using SSH under the covers. Conveniently, the Python script also captures the output from each compute node and prints it out in the shell that DCLI was run from. The output from each individual compute node is prefixed by that particular compute node's name so that it is easy for the administrator to see if something untoward occurred on one of the compute nodes only.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A good way of testing DCLI, is to SSH to your nominated 'master' compute node in the Exalogic rack (eg. the 1st one), as root user, and create a file (eg. called '&lt;i&gt;nodelist'&lt;/i&gt;) which contains the hostnames of all the compute nodes in the rack (separated by newlines). For example, my &lt;i&gt;nodelist&lt;/i&gt; file has the following entries in the first 3 lines:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; el01cn01&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; el01cn02&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; el01cn03&lt;/i&gt;&lt;/div&gt;&lt;div&gt;....&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note: You can comment out one or more hostnames with a hash ('#') if you want DCLI to ignore particular hostnames.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a reminder on Exalogic compute node naming conventions, 'el01' is the Exalogic rack's default name and 'cn01' contains the number of the specific compute node in that rack.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once you've created the list of target compute nodes for DCLI to distribute commands to, a nice test is to run a DCLI command that just prints the date-time of each compute node to the shell output of your master compute node (using the &lt;i&gt;/bin/date&lt;/i&gt; Linux command). For example:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;i&gt; &lt;b&gt;# /opt/exalogic.tools/tools/dcli -t -g nodeslist /bin/date&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div div=""&gt;&lt;div&gt;Example output: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; Target nodes: ['el01cn01', 'el01cn02', 'el01cn03',....]&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; el01cn01: Mon Feb 21 21:11:42 UTC 2011&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; el01cn02: Mon Feb 21 21:11:42 UTC 2011&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; el01cn03: Mon Feb 21 21:11:42 UTC 2011&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt; ....&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When this runs, you will be prompted for the password for each compute node that DCLI contacts using SSH. The '&lt;i&gt;-t&lt;/i&gt;' option tells DCLI to first print out all the names of all nodes it will run the operation on, which is useful for double-checking  that you are hitting the compute nodes you intended. The -g command provides the name of the file that contains the list of nodes to operate on (in this case, '&lt;i&gt;nodelist'&lt;/i&gt; in the current directory).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;SSH Trust and User Equivalence&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To use DCLI without being prompted for a password for each compute node that is contacted, it is preferable to first set-up SSH Trust between the master compute node and all the other compute nodes. DCLI calls this "user equivalence"; a named user on one compute node will then be assumed to have the same identity as the same named user on all other compute nodes. On your nominated 'master' compute node (eg. '&lt;i&gt;el01cn01&lt;/i&gt;'), as root user, first generate an SSH public-private key for the root user. For example:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;b&gt;# ssh-keygen -N '' -f ~/.ssh/id_dsa -t dsa&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This places the generated public and private key files in the '&lt;i&gt;.ssh&lt;/i&gt;' sub-directory of the root user's home directory (note, '' in the command is two single quotes)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Now run the DCLI command with the '&lt;i&gt;&lt;b&gt;-k&lt;/b&gt;&lt;/i&gt;' option as shown below which pushes the current user's SSH public key to each other compute node's '&lt;i&gt;.ssh/authorized_keys&lt;/i&gt;' file to establish SSH Trust. You will again be prompted to enter the password for each compute node, but this will be the last time you will need to. With the '&lt;i&gt;-k&lt;/i&gt;' option, each compute node is contacted sequentially rather than in parallel, to give you chance to enter the password for each node in turn.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt; # /opt/exalogic.tools/tools/dcli -t -g nodeslist -k -s "\-o StrictHostKeyChecking=no"&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my example  above, I also pass the SSH option '&lt;i&gt;StrictHostKeyChecking=no&lt;/i&gt;' so you avoid being prompted with the standard SSH question "&lt;i&gt;Are you sure you want to continue connecting (yes/no)&lt;/i&gt;", for each compute node that is contacted. The master compute node will then be added to the list of SSH known hosts on each other compute node, so that this &lt;i&gt;yes/no&lt;/i&gt; question will never occur again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once the DCLI command completes you have established SSH Trust and User Equivalence. Any subsequent DCLI commands that you issue, from now on, will occur without you being prompted fo passwords.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;You can then run the original date-time test again, to satisfy yourself that SSH Trust and User Equivalence is indeed established between the master compute node and each other compute node and that no passwords are prompted for.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;# /opt/exalogic.tools/tools/dcli -t -g nodeslist /bin/date&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;Useful Examples&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now lets have a look at some examples common DCLI commands you might need to issue for your new Exalogic system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Example 1&lt;/b&gt; - Add a new OS group to each compute node called '&lt;i&gt;oracle&lt;/i&gt;' with group id &lt;i&gt;500&lt;/i&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;# /opt/exalogic.tools/tools/dcli -t -g nodeslist groupadd -g 500 oracle&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Example 2&lt;/b&gt; - Add a new OS user to each compute node called '&lt;i&gt;oracle&lt;/i&gt;' with user id &lt;i&gt;500&lt;/i&gt; as a member of the new '&lt;i&gt;oracle&lt;/i&gt;' group:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;# /opt/exalogic.tools/tools/dcli -t -g nodeslist useradd -g oracle -u 500 oracle&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Example 3&lt;/b&gt; - Set the password to '&lt;i&gt;welcome1&lt;/i&gt;' for the OS '&lt;i&gt;root&lt;/i&gt;' user and the new '&lt;i&gt;oracle&lt;/i&gt;' user on each compute node (this uses another feature of DCLI where, if multiple commands need to be run in one go, they can be added to a file, which I tend to suffix with '.scl' in my examples - 'scl' is the convention for 'source command line', and the '&lt;i&gt;-x&lt;/i&gt;' parameter is provided to tell DCLI to run commands from the named file):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt; # vi setpasswds.scl&lt;/b&gt;&lt;br /&gt;&lt;i&gt;echo welcome1 | passwd root --stdin&lt;br /&gt;echo welcome1 | passwd &lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;i&gt;oracle &lt;/i&gt;&lt;/span&gt;--stdin&lt;br /&gt;&lt;/i&gt;&lt;b&gt; # chmod u+x setpasswds.scl&lt;/b&gt;&lt;br /&gt;&lt;b&gt; # /opt/exalogic.tools/tools/dcli&lt;b&gt; -t -g nodeslist -x setpasswds.scl&lt;/b&gt;&lt;/b&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;b&gt;Example 4&lt;/b&gt; - &lt;/b&gt;Create a new mount point directory and definition on each compute node for mounting the common/general NFS share which exists on Exalogic's ZFS Shared Storage appliance (the hostname of the HA shared storage on Exalogic's internal InfiniBand network in my example is '&lt;i&gt;el01sn-priv&lt;/i&gt;') and then from each compute node, permanently mount the NFS Share:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;b style="font-weight: bold; "&gt; # &lt;/b&gt;&lt;b style="font-weight: bold; "&gt;/opt/exalogic.tools/tools/dcli -t -g nodeslist mkdir -p &lt;/b&gt;&lt;b&gt;/u01/common/general&lt;/b&gt;&lt;br /&gt;&lt;b style="font-weight: bold; "&gt; # &lt;/b&gt;&lt;b style="font-weight: bold; "&gt;/opt/exalogic.tools/tools/dcli -t -g nodeslist chown -R oracle:oracle &lt;/b&gt;&lt;b&gt;/u01/common/general&lt;/b&gt;&lt;br /&gt;&lt;b style="font-weight: bold; "&gt; # vi addmount.scl&lt;/b&gt;&lt;br /&gt;&lt;i&gt;cat &amp;gt;&amp;gt; /etc/fstab &amp;lt;&amp;lt; EOF&lt;br /&gt;el01sn-priv:/export/common/general /u01/common/general nfs rw,bg,hard,nointr,rsize=131072,wsize=131072,tcp,vers=3 0 0&lt;br /&gt;EOF&lt;br /&gt;&lt;/i&gt;&lt;b style="font-weight: bold; "&gt;# chmod u+x addmount.scl&lt;/b&gt;&lt;div&gt;&lt;b style="font-weight: bold; "&gt;# /opt/exalogic.tools/tools/dcli -t -g nodeslist -x addmount.scl&lt;/b&gt;&lt;br /&gt;&lt;b style="font-weight: bold; "&gt; # /opt/exalogic.tools/tools/dcli -t -g nodeslist mount /u01/common/general&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b style="font-weight: bold; "&gt;&lt;u&gt;Running DCLI As Non-Root User&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the default Exalogic set-up, DCLI executes as root user when issuing all of its commands regardless of what OS user's shell you use to enter the DCLI command from. Although root access is often necessary for creating things like OS users, groups and mount points, it is not desirable if you just want to use DCLI to execute non-privileged commands under a specific OS user on all computes nodes. For example, as a new '&lt;i&gt;coherence&lt;/i&gt;' OS user, you may want the ability to run a script that starts a Coherence Cache Server instance on every one of the compute nodes in the Exalogic rack, in one go, to automatically join the same Coherence cluster.  &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;To enable DCLI to be used under any OS user and to run all its distributed commands on all compute nodes, as that OS user, we just need to make a few simple one-off changes on our master compute node where DCLI is being run from...&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;b&gt;1.&lt;/b&gt; &lt;/b&gt;As root user, allow all OS users to access the Exalogic tools directory that contains the DCLI tool:&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;b&gt;# chmod a+x /opt/exalogic.tools/tools&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b style="font-weight: bold; "&gt;2.&lt;/b&gt; As root user, change the permissions of the DCLI tool to be executable by all users:&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;b&gt;# chmod a+x /opt/exalogic.tools/tools/dcli&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;b&gt;3.&lt;/b&gt; &lt;/b&gt;As root user, modify, the DCLI python script (&lt;i&gt;/opt/exalogic.tools/tools/dcli&lt;/i&gt;) using 'vi' and replace the line....&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;    USER_ID="root"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; ...with the line...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;   USER_ID=pwd.getpwuid(os.getuid())[0]&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This script line uses some Python functions to set the DCLI user id to the name of the current OS user running the DCLI command, rather than the hard-coded 'root' username.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;4. &lt;/b&gt;Whilst still editing the file using vi, add the following Python library import command near the top of the DCLI Python script to enable the 'pwd' Python library to be referenced by the code in step 3.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;b&gt;   import pwd&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Now log-on to your master compute node as your new non-root OS user (eg. 'coherence' user) and once you've done the one-off setup of your nodelist file and SSH-Trust/User-Equivalence (as described earlier), you will happily be able run DCLI commands accross all compute nodes as your new OS user. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, for a test Coherence project I've been playing with recently, I have a Cache Server 'start in-background' script in a Coherence project located on my Exalogic's ZFS Shared Storage. When I run script using the DCLI command below, from my 'coherence' OS user shell on my master compute node, 30 Coherence cache servers instances are started immediately, almost instantly forming a cluster across the compute nodes in the rack. &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;b&gt;# /opt/exalogic.tools/tools/dcli -t -g nodeslist /u01/common/general/my-coh-proj/start-cache-server.sh&lt;/b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Just for fun I can run this again to allow 30 more Coherence servers to start-up and join the same Coherence cluster, now containing 60 members.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b style="font-weight: bold; "&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;As you can see DCLI is pretty powerful yet very simple in both concept and execution!&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Song for today: Death Rays by &lt;a href="http://en.wikipedia.org/wiki/Mogwai"&gt;Mogwai&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-1515874284988609934?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/1515874284988609934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=1515874284988609934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1515874284988609934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1515874284988609934'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2011/03/exalogic-dcli-run-commands-on-all.html' title='Exalogic DCLI - run commands on all compute nodes at once'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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-1304066656993695443.post-8388426855134002696</id><published>2011-01-23T01:23:00.012Z</published><updated>2011-03-20T10:16:07.111Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rac'/><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimizations'/><category scheme='http://www.blogger.com/atom/ns#' term='infiniband'/><category scheme='http://www.blogger.com/atom/ns#' term='exalogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Optimisations'/><category scheme='http://www.blogger.com/atom/ns#' term='JRockit'/><category scheme='http://www.blogger.com/atom/ns#' term='SDP'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><category scheme='http://www.blogger.com/atom/ns#' term='exadata'/><category scheme='http://www.blogger.com/atom/ns#' term='coherence'/><title type='text'>Exalogic Software Optimisations</title><content type='html'>&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span"&gt;[Update 19-March-2001 - this blog entry is actually a short summary of a much more detailed Oracle internal document I wrote in December 2010. A &lt;a href="http://www.oracle.com/us/products/middleware/exalogic-software-overview-345527.pdf"&gt;public whitepaper&lt;/a&gt; using the content from my internal document, has now been published on &lt;a href="http://www.oracle.com/us/products/middleware/exalogic"&gt;Oracle's Exalogic home page&lt;/a&gt; (see "White Papers" tab on right-hand side of the home page); for the public version, a revised introduction, summary and set of diagrams have been contributed by Oracle's Exalogic Product Managers.]&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;For version 1.0 of &lt;a href="http://www.oracle.com/exalogic"&gt;Exalogic&lt;/a&gt; there is a number of Exalogic-specific enhancements and optimisations that have been made to the Oracle Application Grid middleware products, specifically:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;the &lt;a href="http://www.oracle.com/weblogic"&gt;WebLogic&lt;/a&gt; application server product;&lt;/li&gt;&lt;li&gt;the &lt;a href="http://www.oracle.com/jrockit"&gt;JRockit&lt;/a&gt; Java Virtual Machine (JVM) product;&lt;/li&gt;&lt;li&gt;the &lt;a href="http://www.oracle.com/us/products/middleware/coherence"&gt;Coherence&lt;/a&gt; in-memory clustered data-grid product.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;In many cases, these product enhancements address performance limitations that are not present on general purpose hardware that uses Ethernet based networking. Typically, these limitations are only manifested when running on Exalogic's high-density computing nodes with InfiniBand's fast-networking infrastructure. Most of these enhancements are designed to enable the benefits of the high-end hardware components, that are unique to Exalogic, to be utilised to the full. This results in a well balanced hardware/software system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I find it useful to categorise the optimisations in the following way:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Increased server scalability, throughput and responsiveness.&lt;/b&gt; Improvements to the networking, request handling, memory and thread management mechanisms, within WebLogic and JRockit, enable the products to scale better on the high-multi-core compute nodes that are connected to the fast InfiniBand fabric. WebLogic will use Java NIO based non-blocking server socket handlers (muxers) for more efficient request processing,  multi-core aware thread pools and shared byte buffers to reduce data copies between sub-system layers. Coherence also includes changes to ensure more optimal network bandwidth usage when using InfiniBand networking.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Superior server session replication performance.&lt;/b&gt; WebLogic's In-Memory HTTP Session Replication mechanism is improved to utilise the large InfiniBand bandwidth available between clustered servers. A WebLogic server replicates more of the session data in parallel, over the network to a second server, using parallel socket connections (parallel "RJVMs") instead of just a single connection. WebLogic also avoids a lot of the unnecessary processing that usually takes place on the server receiving session replicas, by using "lazy de-serialisation". With the help of the underlying JRockit JVM, WebLogic skips the host node's TCP/IP stack, and uses InfiniBand's faster “native” networking protocol, called SDP, to enable the session payloads to be sent over the network with lower latency. As a result, for stateful web applications requiring high availability, end-user requests are responded to far quicker.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Tighter Oracle RAC integration for faster and more reliable database interaction.&lt;/b&gt; For Exalogic, WebLogic includes a new component called “Active Gridlink for RAC” that provides application server connectivity to Oracle RAC clustered databases. This supersedes the existing WebLogic capability for Oracle RAC connectivity, commonly referred to as “Multi-Data-Sources”. Active Gridlink provides intelligent Runtime Connection Load-Balancing (RCLB) across RAC nodes based on the current workload of each RAC node, by subscribing to the database's Fast Application Notification (&lt;a href="http://download.oracle.com/docs/cd/B19306_01/rac.102/b14197/hafeats.htm#BABECAFD"&gt;FAN&lt;/a&gt;) events using Oracle Notification Services (ONS). Active Gridlink uses Fast Connection Failover (&lt;a href="http://download.oracle.com/docs/cd/B28359_01/java.111/e10788/rac.htm#CHDHCGGG"&gt;FCF&lt;/a&gt;) to enable rapid RAC node failure detection for greater application resilience (using ONS events as an input). Active GridLink also allows more transparent RAC node location management with support for &lt;a href="http://wiki.oracle.com/page/Oracle+RAC11g+R2+SINGLE+CLIENT+ACCESS+NAME-+SCAN"&gt;SCAN&lt;/a&gt; and uses RAC node affinity for handling global (XA) transactions more optimally. Consequently, enterprise Java applications involving intensive database work, achieve a higher level of availability with better throughput and more consistent response times.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Reduced Exalogic to Exadata response times.&lt;/b&gt; When an Exalogic system is connected directly to an Exadata system (using the built-in Infiniband switches and cabling), WebLogic is able to use InfiniBand's faster “native” networking protocol, SDP, for JDBC interaction with the Oracle RAC database on Exadata. This incorporates enhancements to JRockit and the Oracle Thin JDBC driver in addition to WebLogic. With this optimisation, an enterprise Java application that interacts with Exadata, is able to respond to client requests quicker, especially where large JDBC result sets need to be passed back from Exadata to Exalogic.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;To summarise, Exalogic provides a high performance, highly redundant hardware platform for any type of middleware application. If the middleware application happens to be running on Oracle's Application Grid software, further significant performance gains will be achieved.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 11px; line-height: 16px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); "&gt;Song for today: Come to Me by &lt;a href="http://en.wikipedia.org/wiki/65daysofstatic"&gt;65daysofstatic&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-8388426855134002696?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/8388426855134002696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=8388426855134002696' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/8388426855134002696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/8388426855134002696'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2011/01/exalogic-software-optimisations.html' title='Exalogic Software Optimisations'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-1282259397592358457</id><published>2010-12-10T06:10:00.002Z</published><updated>2011-01-17T21:04:59.501Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='exalogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Docs'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Downloads'/><category scheme='http://www.blogger.com/atom/ns#' term='OneCommand'/><title type='text'>Exalogic downloads and documentation links</title><content type='html'>Now that Exalogic has been &lt;a href="http://pauldone.blogspot.com/2010/12/exalogic-10-is-here.html"&gt;released&lt;/a&gt;, the main Exalogic documentation is available at: &lt;a href="http://download.oracle.com/docs/cd/E18476_01/index.htm"&gt;http://download.oracle.com/docs/cd/E18476_01/index.htm&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Worth particular attention is the "Machine Owner's Guide" and the "Enterprise Deployment Guide". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;Machine Owner's Guide&lt;/b&gt; will give you a good idea of the machine's internal specifications as well as the unit's external dimensions, power consumption needs, cooling needs, multi-rack cabling configurations, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;b&gt;Enterprise Deployment Guide&lt;/b&gt; (EDG) will point you in the right direction if you want to install and configure the Application Grid products on Exalogic in an optimal way for performance and highly-availability.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; "&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;If you are about to take shipment of &lt;span class="Apple-style-span" &gt;Exalogic &lt;/span&gt;and need copies of the software, then these can be accessed from the Oracle eDelivery website, using the following steps:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="margin-left: 15px; "&gt;Browse to the &lt;b&gt;eDelivery&lt;/b&gt; site at &lt;a href="http://edelivery.oracle.com/" target="_blank" style="color: rgb(0, 0, 204); "&gt;http://edelivery.oracle.&lt;wbr&gt;com/&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-left: 15px; "&gt;Press "Continue" link&lt;/li&gt;&lt;li style="margin-left: 15px; "&gt;Submit the requested user info when prompted, accepting the restrictions&lt;/li&gt;&lt;li style="margin-left: 15px; "&gt;In the resulting search page, for the &lt;i&gt;Product Pack&lt;/i&gt; field, select "&lt;b&gt;Oracle Fusion Middleware&lt;/b&gt;", and for &lt;i&gt;Platform&lt;/i&gt; field select "&lt;b&gt;Linux x86-64&lt;/b&gt;"&lt;/li&gt;&lt;li style="margin-left: 15px; "&gt;In the results page, press the link for "&lt;b&gt;Oracle Exalogic Elastic Cloud Software 11g Media Pack&lt;/b&gt;"&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;The &lt;span class="Apple-style-span" style="color: rgb(34, 34, 34); "&gt;Exalogic&lt;/span&gt; downloads include:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li style="margin-left: 15px; "&gt;&lt;b&gt;Compute Node Base Image for &lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;Exalogic&lt;/b&gt;&lt;/span&gt; (parts 1 and 2)&lt;/b&gt; - this is the Oracle Enterprise Linux image including the Unbreakable Enterprise Kernel, OFED drivers for InfiniBand connectivity, and various supporting command line utilities&lt;/li&gt;&lt;li style="margin-left: 15px; "&gt;&lt;b&gt;Configuration Utilities for &lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;Exalogic&lt;/b&gt;&lt;/span&gt;&lt;/b&gt; - this is the set of "Middleware Machine Configurator" tools, including the spreadsheet and accompanying shell scripts to help users peform the base network configuration for all the compute nodes in an &lt;span class="Apple-style-span" style="color: rgb(34, 34, 34); "&gt;Exalogic &lt;/span&gt;rack (a.k.a. "OneCommand")&lt;/li&gt;&lt;li style="margin-left: 15px; "&gt;&lt;b&gt;Oracle WebLogic Server 11gR1 (10.3.4)&lt;/b&gt; - this is the combined WebLogic/JRockit/Coherence .bin installer for &lt;span class="Apple-style-span" style="color: rgb(34, 34, 34); "&gt;Exalogic&lt;/span&gt; (Linux x86-64)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; font-size: 11px; color: rgb(51, 51, 51); font-style: italic; line-height: 16px; "&gt;Song for today: Cause = Time by &lt;a href="http://en.wikipedia.org/wiki/Broken_Social_Scene"&gt;Broken Social Scene&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-1282259397592358457?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/1282259397592358457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=1282259397592358457' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1282259397592358457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1282259397592358457'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2010/12/exalogic-downloads-and-documentation.html' title='Exalogic downloads and documentation links'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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-1304066656993695443.post-5369490872243222209</id><published>2010-12-09T12:24:00.022Z</published><updated>2010-12-09T16:02:02.996Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='sun'/><category scheme='http://www.blogger.com/atom/ns#' term='infiniband'/><category scheme='http://www.blogger.com/atom/ns#' term='exalogic'/><category scheme='http://www.blogger.com/atom/ns#' term='JRockit'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='coherence'/><category scheme='http://www.blogger.com/atom/ns#' term='solaris'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Exalogic 1.0 is here!</title><content type='html'>&lt;div&gt;General availability of Oracle's brand new &lt;a href="http://www.oracle.com/us/products/middleware/exalogic"&gt;Exalogic Elastic Cloud&lt;/a&gt; product has just been &lt;a href="http://www.oracle.com/us/corporate/press/193480"&gt;publically announced&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/TQDTOmUiNlI/AAAAAAAAAHc/uN9bBarIIPg/s1600/Exalogic.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 244px; height: 192px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/TQDTOmUiNlI/AAAAAAAAAHc/uN9bBarIIPg/s320/Exalogic.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5548666988678755922" /&gt;&lt;/a&gt;&lt;div&gt;Just in case you've somehow missed the buzz and haven't got a clue what Exalogic is, I'll describe it for you a little here...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Exalogic is an integrated hardware and software system that is engineered, tested, and tuned to run enterprise Java applications, as well as native applications, with an emphasis on high performance and high availability (HA). Exalogic incorporates redundant hardware with dense-computing resources, ZFS Shared Storage and &lt;a href="http://www.sun.com/products/networking/infiniband.jsp"&gt;InfiniBand&lt;/a&gt; networking. This hardware is sized and customised for optimum use by Oracle 'Application Grid' software products, to provide a balanced hardware/software system. Specifically, the &lt;b&gt;WebLogic&lt;/b&gt; Application Server, &lt;b&gt;JRockit&lt;/b&gt; Java Virtual Machine (JVM) and &lt;b&gt;Coherence&lt;/b&gt; In-Memory Data Grid products have been enhanced to leverage some of the unique features of the underlying hardware, for maximum performance and HA.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you are familiar with Exadata and it being the "&lt;i&gt;database machine&lt;/i&gt;", then think of Exalogic as the "&lt;i&gt;middleware machine&lt;/i&gt;". Physically linking the two together in a data-centre gives you the foundation for a very high-end Enterprise Java based OLTP solution.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Exalogic is a system rather than appliance, where users are able to install, develop or run what they want as long as it is Linux/Solaris x86-64 compatible. Even though some of the elements of Exalogic, like InfiniBand, are more often found in the &lt;a href="http://www.top500.org/"&gt;supercomputing world&lt;/a&gt;, Exalogic is intended as a general purpose system for running enterprise business applications. Exalogic will just appear to the hosted applications as a set of general purpose operating systems and processors with common standards-based networking. This means that unlike the supercomputing world, developers don't have to create bespoke software specifically tailored to run on a high-end proprietary platform.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For further information, see the Oracle &lt;a href="http://www.oracle.com/us/products/middleware/exalogic-wp-173449.pdf"&gt;introduction to Exalogic whitepaper&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, sans-serif; font-size: 11px; color: rgb(51, 51, 51); font-style: italic; line-height: 16px; "&gt;Song for today: Whipping Song by &lt;a href="http://en.wikipedia.org/wiki/Sister_Double_Happiness"&gt;Sister Double Happiness&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-5369490872243222209?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/5369490872243222209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=5369490872243222209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5369490872243222209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5369490872243222209'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2010/12/exalogic-10-is-here.html' title='Exalogic 1.0 is here!'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fRAf2L_KiFc/TQDTOmUiNlI/AAAAAAAAAHc/uN9bBarIIPg/s72-c/Exalogic.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-5197329162169108368</id><published>2010-08-28T11:42:00.013+01:00</published><updated>2010-08-28T12:33:03.361+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='WLDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Instrumentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Harvest'/><category scheme='http://www.blogger.com/atom/ns#' term='Watch'/><title type='text'>A simplified view of WLDF</title><content type='html'>The WebLogic Diagnostic Framework (WLDF) is a very powerful capability that has been in the product since WebLogic 9.0. WebLogic's product documentation does a good job of describing the fine detail of WLDF, but I believe that the &lt;a href="http://download.oracle.com/docs/cd/E14571_01/web.1111/e13714/architecture.htm#i1085986"&gt;high level overview&lt;/a&gt; it provides is too verbose and makes WLDF seem more complicated than it is. This is probably one reason why I don't see WLDF used quite as often as it should be, in place of custom coded monitoring solutions.&lt;br /&gt;&lt;br /&gt;A couple of years ago I created my own diagram showing WLDF's composition, in an attempt to demonstrate that it's actually a fairly simple concept. However, I never got around to publishing it. Prompted by a recent request, I thought I'd address this ommision now, so here is that diagram...&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fRAf2L_KiFc/THjyzAxpRiI/AAAAAAAAAHU/JMT5_4JYiK8/s1600/wldfsimplified_pdone.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 188px;" src="http://4.bp.blogspot.com/_fRAf2L_KiFc/THjyzAxpRiI/AAAAAAAAAHU/JMT5_4JYiK8/s400/wldfsimplified_pdone.png" alt="" id="BLOGGER_PHOTO_ID_5510421102283277858" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Hopefully this helps to better show the power of WLDF and that it's not as complex as one might think.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Song for today: Maps by &lt;a href="http://en.wikipedia.org/wiki/Yeah_Yeah_Yeahs"&gt;Yeah Yeah Yeahs&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-5197329162169108368?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/5197329162169108368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=5197329162169108368' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5197329162169108368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5197329162169108368'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2010/08/simplified-view-of-wldf.html' title='A simplified view of WLDF'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fRAf2L_KiFc/THjyzAxpRiI/AAAAAAAAAHU/JMT5_4JYiK8/s72-c/wldfsimplified_pdone.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-1959460040696290618</id><published>2010-08-11T09:02:00.008+01:00</published><updated>2010-08-18T11:01:36.467+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JRockit'/><category scheme='http://www.blogger.com/atom/ns#' term='Threads'/><category scheme='http://www.blogger.com/atom/ns#' term='Heap'/><category scheme='http://www.blogger.com/atom/ns#' term='flight recorder'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><category scheme='http://www.blogger.com/atom/ns#' term='JRMC'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Review of the new JRockit book</title><content type='html'>As &lt;a href="http://pauldone.blogspot.com/2010/06/new-jrockit-book.html"&gt;promised&lt;/a&gt;, here's my review of the &lt;a href="https://www.packtpub.com/oracle-jrockit-the-definitive-guide/book?utm_source=pauldone.blogspot.com&amp;amp;utm_medium=link&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_003663"&gt;new JRockit book&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/TGJVO8UHv-I/AAAAAAAAAG8/Ampq52DeNcE/s1600/jr.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 202px; height: 258px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/TGJVO8UHv-I/AAAAAAAAAG8/Ampq52DeNcE/s320/jr.jpg" alt="" id="BLOGGER_PHOTO_ID_5504055409797218274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Having used JRockit for years (mostly sitting beneath WebLogic) I've been waiting for something like this book to arrive and lift the lid off the JVM to show what's inside. I'm glad to say that I am not disappointed. This book is a must-have for any serious enterprise Java developer or administrator who uses JRockit and wants to better understand how to tune, manage and monitor the JVM. The book also provides the Java developer with a clearer direction on the do's and don't's for developing a well behaving application on top of JRockit, especially in regard to memory management and thread management. Even for users of other JVMs, like Hotspot, much of the first half of the book, which concentrates on the JVM's internals, is relevant and insightful into the workings of Java virtual machines generally.&lt;br /&gt;&lt;br /&gt;The first half of the book concentrates on providing in-depth knowledge of JRockit's internals and focusses on:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Code Generation&lt;/span&gt; (Java bytecode, generation of native code, JRockit 's Just In Time compilation strategy with subsequent optimised code re-generation)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Memory Management&lt;/span&gt; (heap usage, thread-local allocation, garbage collection strategies, deterministic-GC, 32-bit vs 64-bit memory management, potential pitfalls)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Threads and Synchronisation&lt;/span&gt; (green vs O.S. threads, synchronisation patterns/anti-patterns, code generation strategies for locking/unlocking, thin and fat locks, lock profiling)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Benchmarking and Tuning&lt;/span&gt; (throughput vs latency, tuning tips, benchmarking tips)&lt;/li&gt;&lt;/ul&gt;Don't be put off by the early exposure to Java bytecode samples in the book. The bytecode examples are only used liberally and only in a couple of early chapters. It's worth reading these bytecode samples carefully because the points these chapters make will resonate more strongly if you do.&lt;br /&gt;&lt;br /&gt;As I read this book, it became evident that the JRockit engineers are extremely passionate about their work and that they live and breath it. It is re-assuring to know that they are constantly striving to improve the product, based on deep scientific theory yet always with an eye on pragmatism and real-world usage. I'm sure this is why JRockit is fast and powerful whilst remaining easy to manage and run applications on. Throughout the book, the ethos of JRockit's design is very clear. It's an &lt;span style="font-style: italic;"&gt;adaptive&lt;/span&gt; JVM, where the internal runtime is constantly and automatically being re-evaluated and re-tuned, according to the current nature of the hosted application's usage and load. Reading the book, I can better  appreciate the argument that server-side Java is faster than an equivalent native C application. A native application only has one-shot, at compile time, to generate &lt;span style="font-style: italic;"&gt;optimal&lt;/span&gt; native code. JRockit, however, takes the opportunity to revisit this at runtime, when it has a much better idea of actual usage patterns.&lt;br /&gt;&lt;br /&gt;The second half of the book provides an introduction and detailed reference into JRockit's rich and powerful management and monitoring toolset, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;JRockit Mission Control (JRMC)&lt;/span&gt;, composed of the &lt;span style="font-weight: bold;"&gt;Management Console&lt;/span&gt;, the &lt;span style="font-weight: bold;"&gt;Flight Recorder&lt;/span&gt; (plus &lt;span style="font-weight: bold;"&gt; Runtime Analyzer&lt;/span&gt; which it replaces) and the &lt;span style="font-weight: bold;"&gt;Memory Leak Detector&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;JRockit Command line tool (JRCMD)&lt;/span&gt;, including in-depth examples of all the important commands&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;JRockit Management APIs&lt;/span&gt;, including the Java API for direct in-line access to the JRockit JVM from hosted Java applications plus the JMX version of the API for remote access to the JRockit JVM&lt;/li&gt;&lt;/ul&gt;These chapters provide an easy to read introduction to the key features of JRockit's rich tools, lowering the barrier to use for newbies. Also, many of the illustrated examples are use-case driven, acting as a handy reference guide to come back to at a later date. For example, if you suspect that you have a memory leak in your application and want to work out how best to locate the root of the leak, using the tools, the Leak Detector chapter will take you by the hand through this process.&lt;br /&gt;&lt;br /&gt;Finally, at the end of the book there is an introductory chapter covering JRockit Virtual Edition (VE). JRockit VE enables the JRockit JVM, accompanied by a small JRockit &lt;span style="font-style: italic;"&gt;kernel&lt;/span&gt;, to be run in a virtualised environment. This runs directly on-top of a hypervisor (eg. Oracle VM) without requiring the use of a conventional, heavy-weight, general-purpose operations system such as Linux, Solaris or Windows. Such a fully functional operating systems would otherwise burden the system with a layer of unwanted latency. This chapter in particular makes me realise that the JRockit Engineers are proverbial Rocket Scientists (or should that be &lt;span style="font-style: italic;"&gt;Rockit&lt;/span&gt; Scientists? :D ). I defy anyone not to be impressed by the ambition of JRockit VE and and the high level of technical expertise that must have gone into developing it!&lt;br /&gt;&lt;br /&gt;To summarise, I highly recommend this book. Easy to read yet very insightful. Once you've read it, it will remain as a handy reference to come back to, especially when needing to use the JRMC tools to diagnose issues and tune the JVM and hosted applications.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Song for today: Speed Trials by &lt;a href="http://en.wikipedia.org/wiki/Elliot_Smith"&gt;Elliot Smith&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-1959460040696290618?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/1959460040696290618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=1959460040696290618' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1959460040696290618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1959460040696290618'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2010/08/review-of-new-jrockit-book.html' title='Review of the new JRockit book'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fRAf2L_KiFc/TGJVO8UHv-I/AAAAAAAAAG8/Ampq52DeNcE/s72-c/jr.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-1164336936782577361</id><published>2010-08-04T21:21:00.018+01:00</published><updated>2010-08-18T11:05:16.318+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='WLDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainHealth'/><category scheme='http://www.blogger.com/atom/ns#' term='JMX'/><title type='text'>New release of DomainHealth WebLogic monitoring tool</title><content type='html'>I've just released the latest version of DomainHealth - version 0.9.&lt;br /&gt;&lt;br /&gt;DomainHealth is an open source "zero-config" monitoring tool for WebLogic. It collects important server metrics over time, archives these into CSV files and provides a simple web interface for viewing graphs of current and historical statistics.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fRAf2L_KiFc/TF1tv0oSOLI/AAAAAAAAAGs/GdY3yACvbLE/s1600/DH_Core.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 229px;" src="http://1.bp.blogspot.com/_fRAf2L_KiFc/TF1tv0oSOLI/AAAAAAAAAGs/GdY3yACvbLE/s400/DH_Core.png" alt="" id="BLOGGER_PHOTO_ID_5502674988065503410" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;This release includes a new look and feel and a new page navigation mechanism (based on some contributions from Alain Gregoire). Other new features included are Web-App monitoring, EJB monitoring and various minor improvements and tweaks. For a full list of changes see the Release Notes document listed alongside the DomainHealth download files.&lt;br /&gt;&lt;br /&gt;You can download DH from the project home page at &lt;a href="http://sourceforge.net/projects/domainhealth"&gt;http://sourceforge.net/projects/domainhealth&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The help docs for DH are at &lt;a href="http://sourceforge.net/apps/mediawiki/domainhealth"&gt;http://sourceforge.net/apps/mediawiki/domainhealth&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'd like to say a big thank you to Alain Gregoire for his valuable design and code contributions to this version of DomainHealth.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Song for today: Lets Go For A Ride by &lt;a href="http://en.wikipedia.org/wiki/Cracker_%28band%29"&gt;Cracker&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-1164336936782577361?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/1164336936782577361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=1164336936782577361' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1164336936782577361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1164336936782577361'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2010/08/new-release-of-domainhealth-weblogic.html' title='New release of DomainHealth WebLogic monitoring tool'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fRAf2L_KiFc/TF1tv0oSOLI/AAAAAAAAAGs/GdY3yACvbLE/s72-c/DH_Core.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-7045801674728742412</id><published>2010-06-18T09:14:00.008+01:00</published><updated>2010-08-08T08:13:08.602+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mission Control'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JRockit'/><category scheme='http://www.blogger.com/atom/ns#' term='flight recorder'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><category scheme='http://www.blogger.com/atom/ns#' term='JRMC'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>New JRockit book</title><content type='html'>A new book, "&lt;span style="font-weight: bold;"&gt;Oracle JRockit: The Definitive Guide&lt;/span&gt;", has just been published.&lt;br /&gt;&lt;br /&gt;More info  is available on the publisher's &lt;a href="https://www.packtpub.com/oracle-jrockit-the-definitive-guide/book?utm_source=pauldone.blogspot.com&amp;amp;utm_medium=link&amp;amp;utm_content=blog&amp;amp;utm_campaign=mdb_003663"&gt;main landing page for the book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've got the book on order and I'll review it here once I've digested it. Judging by the content and the names of the esteemed JRockit engineers that wrote it, I'm expecting this to be an invaluable tome on all things JRockit.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Song  for today: Mr.November by &lt;a href="http://en.wikipedia.org/wiki/The_National_%28band%29"&gt;The National&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-7045801674728742412?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/7045801674728742412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=7045801674728742412' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/7045801674728742412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/7045801674728742412'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2010/06/new-jrockit-book.html' title='New JRockit book'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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-1304066656993695443.post-18872219174749908</id><published>2010-02-22T23:47:00.009Z</published><updated>2010-08-08T08:12:14.041+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='WLDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='JMX'/><category scheme='http://www.blogger.com/atom/ns#' term='MBean'/><title type='text'>WLDF and Spring-generated Custom MBeans</title><content type='html'>In &lt;a href="http://pauldone.blogspot.com/2010/02/creating-custom-mbeans-for-weblogic.html"&gt;last week's blog&lt;/a&gt;, I mentioned a problem which occurs when trying to configure the &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e13714/toc.htm"&gt;WebLogic Diagnostic Framework (WLDF)&lt;/a&gt; to reference Spring-generated custom MBeans. Here I will describe how this issue can be addressed in a fairly simple way.&lt;br /&gt;&lt;br /&gt;Originally, after deploying a web-app containing a Spring-generated MBean, I had attempted to configure a WLDF module using WebLogic's Admin Console to harvest an attribute of this MBean. However, as shown in the screen-shot below, the WLDF tooling was not detecting this custom MBean type as something that could be monitored.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fRAf2L_KiFc/S3q8tUbYWPI/AAAAAAAAAFk/Dy-hxKIWg6A/s1600-h/wldfmissing.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 265px;" src="http://2.bp.blogspot.com/_fRAf2L_KiFc/S3q8tUbYWPI/AAAAAAAAAFk/Dy-hxKIWg6A/s400/wldfmissing.png" alt="" id="BLOGGER_PHOTO_ID_5438866986766981362" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The Spring-generated custom MBean type is not listed (it should begin with &lt;span style="font-style:italic;"&gt;test.management...&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;After doing a little digging around, I realised that WebLogic's WLDF documentation at section "&lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e13714/config_harvester.htm#i1073125"&gt;Specifying Type Names for WebLogic Server MBeans and Custom MBeans&lt;/a&gt;" hints to why this should not work. Specifically it states: "&lt;span style="font-weight: bold;"&gt;...if the MBean is a ModelMBean and there is no value for the MBean Descriptor field DiagnosticTypeName) then the MBean can't be harvested&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Basically, when you try to define a Collected Metric or Watch Rule in a WLDF Diagnostic Module, WLDF needs to know the MBean's implementation class type for the way WLDF categorises MBeans of interest. Even if we don't use the Admin Console and instead use WLST or hack the XML for the domain config diagnostic module directly, we still have this problem because we have to declare the MBean implementation type.&lt;br /&gt;&lt;br /&gt;In Sun's JMX standard, 3 of the 4 possible JMX MBean types (&lt;span style="font-style: italic;"&gt;Standard&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Dynamic&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Open&lt;/span&gt;) are implemented directly by a Java class, which WLDF can automatically detect. However, for the 4th type (&lt;span style="font-style: italic;"&gt;Model&lt;/span&gt; MBean), no direct Java class is used to define the MBean. Instead, the MBean is defined using metadata. As there is no MBean implementation class for WLDF to base its configuration on, it needs a hint for what the implementation class should be assumed to be. Spring-generated custom MBeans are &lt;span style="font-style: italic;"&gt;Model&lt;/span&gt; MBeans and thus are affected by this issue. The WLDF documentation states that the 'implementation hint' should take the form of an explicitly declared MBean Descriptor field called &lt;span style="font-style: italic;"&gt;DiagnosticTypeName&lt;/span&gt;&lt;span style="font-style: italic;"&gt;. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The left-hand side of the screen-shot below shows the Spring-generated custom MBean, as seen via JConsole. The Model MBean descriptor is missing the WebLogic-specific field and hence the MBean can't be used by WLDF. The right-hand side of the screen-shot shows the generated MBean after the WLDF-required field &lt;span style="font-style: italic;"&gt;DiagnosticTypeName&lt;/span&gt; has been included (the rest of this blog will show you how to achieve this).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fRAf2L_KiFc/S3q_MhQNGZI/AAAAAAAAAGc/0W3GgaGn7Ks/s1600-h/joined.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 167px;" src="http://4.bp.blogspot.com/_fRAf2L_KiFc/S3q_MhQNGZI/AAAAAAAAAGc/0W3GgaGn7Ks/s400/joined.png" alt="" id="BLOGGER_PHOTO_ID_5438869721808968082" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;So, for an adequate solution, I really needed a way for Spring to generate MBeans with this field automatically set to an appropriate value. Looking at the documentation for Spring's MBeanExporter (which I described in my &lt;a href="http://pauldone.blogspot.com/2010/02/creating-custom-mbeans-for-weblogic.html"&gt;last blog entry&lt;/a&gt;), I found that &lt;span style="font-style: italic;"&gt;MBeanExporter&lt;/span&gt; has an optional property called &lt;span style="font-style: italic;"&gt;assembler&lt;/span&gt;, which, if not defined, defaults to &lt;a href="http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/jmx/export/assembler/SimpleReflectiveMBeanInfoAssembler.html"&gt;org.springframework.jmx.export.assembler.SimpleReflectiveMBeanInfoAssembler&lt;/a&gt;. This default assembler uses reflection to generate Model MBeans by introspecting the simple Java-bean style classes. I didn't really want to lose the power and simplicity of this, but needed some way to ensure that the generated MBeans included the extra descriptor field. Then I hit upon the idea of extending this Spring assembler class and overriding its &lt;span style="font-style: italic;"&gt;populateMBeanDescriptor()&lt;/span&gt; method to add the extra field after first calling the overridden method to have the other descriptor fields created as normal. So I implemented the following one-off class.&lt;br /&gt;&lt;pre&gt;package customjmx;&lt;br /&gt;&lt;br /&gt;import javax.management.Descriptor;&lt;br /&gt;import org.springframework.jmx.export.assembler.SimpleReflectiveMBeanInfoAssembler;&lt;br /&gt;&lt;br /&gt;public class WLDFAwareReflectiveMBeanInfoAssembler &lt;br /&gt;                    extends SimpleReflectiveMBeanInfoAssembler {&lt;br /&gt;   private static final String WLDF_MBEAN_TYPE_DESCPTR_KEY = &lt;br /&gt;                                           "DiagnosticTypeName";&lt;br /&gt;   private static final String NAME_MBEAN_DESCPTR_KEY = "name";&lt;br /&gt;   private static final String MBEAN_KEYNAME_SUFFIX = "MBean";&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void populateMBeanDescriptor(Descriptor descriptor, &lt;br /&gt;                           Object managedBean, String beanKey) {&lt;br /&gt;      super.populateMBeanDescriptor(descriptor, managedBean, &lt;br /&gt;                                                       beanKey);&lt;br /&gt;      descriptor.setField(WLDF_MBEAN_TYPE_DESCPTR_KEY, &lt;br /&gt;                descriptor.getFieldValue(NAME_MBEAN_DESCPTR_KEY) &lt;br /&gt;                                        + MBEAN_KEYNAME_SUFFIX);&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;In my example code, I just take the original Spring POJO class's name and add the suffix 'MBean' to come up with a name which I feel best conveys the way the MBean is implemented, for the benefit of WLDF. In my example, the &lt;span style="font-style: italic;"&gt;DiagnosticTypeName&lt;/span&gt; descriptor field is created for the MBean with a value of &lt;span style="font-style: italic;"&gt;test.management.TestManagerBeanMBean&lt;/span&gt;. You could easily implement this sub-class code differently to generate a field value using your own convention.&lt;br /&gt;&lt;br /&gt;In my Spring bean definition file (&lt;span style="font-style: italic;"&gt;WEB-INF/applicationContext.xml&lt;/span&gt;) I declared my custom assembler class which extends the Spring default assembler class, and then modified the &lt;span style="font-style: italic;"&gt;exporter&lt;/span&gt; Spring bean to explicitly reference this assembler, as shown in bold below.&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;&amp;lt;bean id="assembler" class="customjmx.WLDFAwareReflectiveMBeanInfoAssembler"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"&lt;br /&gt;                                                      lazy-init="false"&amp;gt;&lt;br /&gt;   &amp;lt;property name="beans"&amp;gt;&lt;br /&gt;      &amp;lt;map&amp;gt;&lt;br /&gt;         &amp;lt;entry key="com.test:name=TestMgr" value-ref="testMgrBean"/&amp;gt;&lt;br /&gt;      &amp;lt;/map&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;property name="server" ref="jmxServerRuntime"/&amp;gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;&amp;lt;property name="assembler" ref="assembler"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;&lt;br /&gt;This time when I re-deployed my web-app to WebLogic and used JConsole to view it, the extra &lt;span style="font-style: italic;"&gt;DiagnosticTypeName&lt;/span&gt; field was present in the MBean (see the right-hand side of the screen-shot above).&lt;br /&gt;&lt;br /&gt;I tried again to create a custom Harvested Metric for an attribute in my Spring generated custom MBean, using WebLogic's Admin Console, and this time I was able to find and select my MBean type as shown in the screen-shot below.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fRAf2L_KiFc/S3q9Tpb2tlI/AAAAAAAAAF8/J_b3SiitKzA/s1600-h/wldfpresent.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 261px;" src="http://1.bp.blogspot.com/_fRAf2L_KiFc/S3q9Tpb2tlI/AAAAAAAAAF8/J_b3SiitKzA/s400/wldfpresent.png" alt="" id="BLOGGER_PHOTO_ID_5438867645241144914" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;On the next page, I was then able to see the available attributes of the MBean type to monitor and choose the 'PropA' one, as shown below.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3q9bSGB9NI/AAAAAAAAAGE/jc1l-fAOq4Q/s1600-h/wldfstep2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 261px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3q9bSGB9NI/AAAAAAAAAGE/jc1l-fAOq4Q/s400/wldfstep2.png" alt="" id="BLOGGER_PHOTO_ID_5438867776414545106" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Finally, I was given the option to select the instance of the MBean to monitor, before pressing finish to save the WLDF module, as shown in the screen-shot below.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3q9kUBNbCI/AAAAAAAAAGM/3KhknBkl7II/s1600-h/wldfstep3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 261px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3q9kUBNbCI/AAAAAAAAAGM/3KhknBkl7II/s400/wldfstep3.png" alt="" id="BLOGGER_PHOTO_ID_5438867931550018594" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Once my WLDF module was activated, I then waited a few minutes before using JConsole to change, dynamically at runtime, the value of &lt;span style="font-style: italic;"&gt;PropA&lt;/span&gt; on my custom MBean. I then went to the &lt;span style="font-style: italic;"&gt;Admin Console | Diagnostics | Log File&lt;/span&gt; page, and selected &lt;span style="font-style: italic;"&gt;HarvestedDataArchive&lt;/span&gt; as the log file, to view the WLDF harvested data. The screen-shot below shows the value of the harvested 'PropA' attribute, taken every 30 seconds, with the new value shown at the base of the page.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fRAf2L_KiFc/S3q9rl3hBNI/AAAAAAAAAGU/z-eYHEJqmd4/s1600-h/archivelog.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 329px;" src="http://4.bp.blogspot.com/_fRAf2L_KiFc/S3q9rl3hBNI/AAAAAAAAAGU/z-eYHEJqmd4/s400/archivelog.png" alt="" id="BLOGGER_PHOTO_ID_5438868056600282322" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;In summary&lt;/span&gt;, it is possible to use WLDF to monitor Spring-generated custom MBeans as long as a WebLogic-specific descriptor field is defined for the generated MBean. In this blog, I have shown one way to achieve this, using a simple class that only has to be written once and then re-used and applied for every MBean required in a deployed app.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Song for today: Saints Around My Neck by &lt;a href="http://en.wikipedia.org/wiki/Come_%28US_band%29"&gt;Come&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-18872219174749908?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/18872219174749908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=18872219174749908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/18872219174749908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/18872219174749908'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2010/02/wldf-and-spring-generated-custom-mbeans.html' title='WLDF and Spring-generated Custom MBeans'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fRAf2L_KiFc/S3q8tUbYWPI/AAAAAAAAAFk/Dy-hxKIWg6A/s72-c/wldfmissing.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-9134474556516255044</id><published>2010-02-16T21:16:00.016Z</published><updated>2010-08-08T08:11:38.776+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='JConsole'/><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='WLST'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='JMX'/><category scheme='http://www.blogger.com/atom/ns#' term='MBean'/><title type='text'>Creating Custom MBeans for WebLogic using Spring</title><content type='html'>In my &lt;a href="http://pauldone.blogspot.com/2010/02/weblogic-and-spring.html"&gt;previous blog&lt;/a&gt; I discussed how WebLogic provides some features to better integrate &lt;span style="font-style: italic;"&gt;Spring-enabled&lt;/span&gt; apps into the app-server, including WebLogic auto-generated MBeans to monitor Spring specific elements of an application. In this blog, I instead focus on Spring's built-in ability to let developers create their own custom MBeans and how these can then be published to WebLogic's Runtime MBean Server rather than the underlying JVM's default Platform MBean Server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why would a developer want to create a custom MBean?&lt;/span&gt; Well the developer may want to provide a standards-based management capability for his/her deployed application, to enable third-party tools to manage and monitor the application remotely.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why would the developer want to publish these MBean's to WebLogic's Runtime MBean Server&lt;/span&gt;? Well, in addition to being visible to generic remote JMX client tools (eg. Sun's JConsole tool), the MBeans are then easily accessible from WebLogic specific tools such as the &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e13715/toc.htm"&gt;WebLogic Scripting Tool (WLST)&lt;/a&gt; and even the &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e13714/toc.htm"&gt;WebLogic Diagnostic Framework (WLDF)&lt;/a&gt;. Also,  WebLogic's capabilities can be leveraged to secure the custom MBeans when associated with WebLogic's MBean Servers. For example, one could secure access to the MBeans using the t3s protocol with a valid username and password.&lt;br /&gt;&lt;br /&gt;A few months ago, Philippe Le Mouel wrote a &lt;a href="http://blogs.oracle.com/WebLogicServer/2009/10/developing_custom_mbeans_to_ma.html"&gt;great article&lt;/a&gt; on how to create custom MBeans and register them with WebLogic, using pretty much standard JavaEE code. As you can see from his article, it takes quite a lot of effort and boilerplate Java code to define an MBean and then register it with the server at start-up.&lt;br /&gt;&lt;br /&gt;In contrast, Spring makes it really easy to generate an MBean as part of your developed JavaEE app and avoid a lot of this coding effort. The &lt;a href="http://static.springsource.org/spring/docs/2.5.x/reference/jmx.html"&gt;Spring Reference (chapter 20&lt;/a&gt;) describes how to do this in detail. In essence, just include a Java-bean style POJO in your JavaEE web-app, like the following, for example:&lt;br /&gt;&lt;pre&gt;package test.management;&lt;br /&gt;&lt;br /&gt;public class TestManagerBean {&lt;br /&gt;   public String getPropA() {&lt;br /&gt;      return propA;&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   public void setPropA(String propA) {&lt;br /&gt;      this.propA = propA;&lt;br /&gt;      System.out.println("PropA set to: " + propA);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public int getPropB() {&lt;br /&gt;      return propB;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void setPropB(int propB) {&lt;br /&gt;      this.propB = propB;&lt;br /&gt;      System.out.println("PropB set to: " + propB);&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   private String propA;&lt;br /&gt;   private int propB;&lt;br /&gt;}&lt;/pre&gt;This example provides two properties to be JMX-enabled (one &lt;span style="font-style: italic;"&gt;String&lt;/span&gt;, one &lt;span style="font-style: italic;"&gt;int&lt;/span&gt;). Obviously, in a real-world application, the getter and setter code would reach inside the rest of the application's code to obtain data or change settings.&lt;br /&gt;&lt;br /&gt;In our application's Spring &lt;span style="font-style: italic;"&gt;WEB-INF/applicationContext.xml&lt;/span&gt; file, we can then define our Spring bean in the normal way with some initial values to be injected into the bean's two properties, e.g.:&lt;br /&gt;&lt;pre&gt;&amp;lt;bean id="testMgrBean" class="test.management.TestManagerBean"&amp;gt;&lt;br /&gt;   &amp;lt;property name="propA" value="Some text"/&amp;gt;&lt;br /&gt;   &amp;lt;property name="propB" value="1000"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;The real add-value that Spring then provides, is the ability for Spring to auto-generate the MBean for us, for inclusion in our deployed app, by using Spring's &lt;span style="font-style: italic;"&gt;MBeanExporter&lt;/span&gt; capability. This is enabled by adding the following definition to our &lt;span style="font-style: italic;"&gt;applicationContext.xml&lt;/span&gt; file, for example:&lt;br /&gt;&lt;pre&gt;&amp;lt;bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"&lt;br /&gt;                                                      lazy-init="false"&amp;gt;&lt;br /&gt;   &amp;lt;property name="beans"&amp;gt;&lt;br /&gt;      &amp;lt;map&amp;gt;&lt;br /&gt;         &amp;lt;entry key="com.test:name=TestMgr" value-ref="testMgrBean"/&amp;gt;&lt;br /&gt;      &amp;lt;/map&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;Now, when you deploy the app to WebLogic, the MBean is generated and registered with an MBean Server. However, by default, the Spring runtime only really knows about the standard Platform MBean server in the underlying JVM that Spring is running on. As a result, upon deployment, Spring registers this generated MBean with the JVM's built-in Platform MBean server only. Spring has no awareness of the possibility to use one of WebLogic's own MBean Servers. We can demonstrate that the JVM's Platform MBean server is currently hosting the deployed custom MBean, by launching the JDK's 'jconsole' tool, from the same machine as the WebLogic is running on, using the following commands:&lt;br /&gt;&lt;pre&gt;$ . /opt/oracle/Middleware/wlserver_10.3/server/bin/setWLSEnv.sh&lt;br /&gt;$ jconsole&lt;/pre&gt;We then select the local Java process corresponding to WebLogic to connect to - we don't specify a username/password:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3ppjIOefgI/AAAAAAAAAE8/btKrYeZrRz0/s1600-h/conn1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 333px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3ppjIOefgI/AAAAAAAAAE8/btKrYeZrRz0/s400/conn1.png" alt="" id="BLOGGER_PHOTO_ID_5438775552227835394" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We can then traverse the JVM's Platform MBean Server, using JConsole's built-in MBean browser. As you can see below, in the MBean list, we can view the standard JVM &lt;span style="font-style: italic;"&gt;java.lang&lt;/span&gt; MBeans, like the &lt;span style="font-style: italic;"&gt;OperatingSystem&lt;/span&gt; MBean and the &lt;span style="font-style: italic;"&gt;Memory&lt;/span&gt; MBean, together with our custom MBean which has an &lt;span style="font-style: italic;"&gt;ObjectName&lt;/span&gt; of &lt;span style="font-style: italic;"&gt;com.test:name=TestMgr&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fRAf2L_KiFc/S3prSHeV5CI/AAAAAAAAAFM/SyvQprzwHr0/s1600-h/show1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 366px;" src="http://2.bp.blogspot.com/_fRAf2L_KiFc/S3prSHeV5CI/AAAAAAAAAFM/SyvQprzwHr0/s400/show1.png" alt="" id="BLOGGER_PHOTO_ID_5438777458991424546" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We can even click in the the shown field for one of the properties (e.g. &lt;span style="font-style: italic;"&gt;PropA&lt;/span&gt;), change the value to "Hello World!", press enter and value is changed in the running MBean. If we view the system-output for the WebLogic Server JVM's O.S. process, we will see the following text logged:&lt;br /&gt;&lt;pre&gt;   PropA set to: Hello World!&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;(we coded this println statement in our example POJO earlier)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What we really want to do though, is have this MBean registered with WebLogic's MBean Server, not the JVM's Platform MBean Server. To do this in Java code we'd have to add a lot of JMX code at application start-up and shut-down time to register/un-register our MBean with the WebLogic MBean Server. However, because we're using Spring, its much easier. In our Spring  &lt;span style="font-style: italic;"&gt;applicationContext.xml&lt;/span&gt; file, we simply add a bean definition to tell Spring to use JNDI to locate the &lt;span style="font-style: italic;"&gt;WebLogic Runtime MBean Server&lt;/span&gt; object at the well known WebLogic JNDI path. Then we modify our &lt;span style="font-style: italic;"&gt;exporter&lt;/span&gt; bean definition to set an optional &lt;span style="font-style: italic;"&gt;server&lt;/span&gt; property of Spring's &lt;span style="font-style: italic;"&gt;MBeanExporter&lt;/span&gt;, giving it the handle to the JMX Server which Spring should export MBeans to. The additions to the Spring bean definition file are shown below in bold:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;&amp;lt;bean id="jmxServerRuntime" class="org.springframework.jndi.JndiObjectFactoryBean"&amp;gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;   &amp;lt;property name="jndiName" value="java:comp/env/jmx/runtime"/&amp;gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"&lt;br /&gt;                                                      lazy-init="false"&amp;gt;&lt;br /&gt;   &amp;lt;property name="beans"&amp;gt;&lt;br /&gt;      &amp;lt;map&amp;gt;&lt;br /&gt;         &amp;lt;entry key="com.test:name=TestMgr" value-ref="testMgrBean"/&amp;gt;&lt;br /&gt;      &amp;lt;/map&amp;gt;&lt;br /&gt;   &amp;lt;/property&amp;gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;   &amp;lt;property name="server" ref="jmxServerRuntime"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;Once re-deployed, we can launch JConsole again, but this time we connect to the WebLogic Runtime MBean Server using T3 to communicate remotely, using the following commands:&lt;br /&gt;&lt;pre&gt;$ . /opt/oracle/Middleware/wlserver_10.3/server/bin/setWLSEnv.sh&lt;br /&gt;$ jconsole -J-Djava.class.path=$JAVA_HOME/lib/jconsole.jar:&lt;br /&gt;    $JAVA_HOME/lib/tools.jar:$WL_HOME/server/lib/weblogic.jar   &lt;br /&gt;    -J-Djmx.remote.protocol.provider.pkgs=weblogic.management.remote&lt;/pre&gt;For the connection URL we specify "&lt;span style="font-style: italic;"&gt;service:jmx:t3://localhost:7001/jndi/weblogic.management.mbeanservers.runtime&lt;/span&gt;" and we provide the WebLogic administrator username/password:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3pvvtNkbJI/AAAAAAAAAFU/shVQxeNMUNA/s1600-h/conn2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 333px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3pvvtNkbJI/AAAAAAAAAFU/shVQxeNMUNA/s400/conn2.png" alt="" id="BLOGGER_PHOTO_ID_5438782365384338578" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We can now see that our MBean is contained in the same JMX list as all WebLogic's server runtime MBeans.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3pz9W6hOTI/AAAAAAAAAFc/4wI-AjtJo9c/s1600-h/show2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 333px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/S3pz9W6hOTI/AAAAAAAAAFc/4wI-AjtJo9c/s400/show2.png" alt="" id="BLOGGER_PHOTO_ID_5438786997963536690" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We can even launch WLST to access our custom MBean by looking up the MBean using the JMX APIs and its &lt;span style="font-style: italic;"&gt;ObjectName&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;$ /opt/oracle/Middleware/wlserver_10.3/common/bin/wlst.sh&lt;br /&gt; &amp;gt; connect('weblogic','welcome1','t3://localhost:7001')&lt;br /&gt; &amp;gt; serverRuntime()&lt;br /&gt; &amp;gt; myMBean = mbs.getObjectInstance(ObjectName('com.test:name=TestMgr'))&lt;br /&gt; &amp;gt; print myMBean&lt;span style="font-style: italic;"&gt;&lt;br /&gt;test.management.TestManagerBean[com.test:name=TestMgr]&lt;/span&gt;&lt;/pre&gt;If we want to get or set a property on the custom MBean using JMX in WLST, we can:&lt;br /&gt;&lt;pre style=""&gt; &amp;gt; print mbs.getAttribute(ObjectName('com.test:name=TestMgr'), 'PropA')&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Some text&lt;/span&gt;&lt;br /&gt; &amp;gt; mbs.setAttribute(ObjectName('com.test:name=TestMgr'), Attribute('PropA', 'Hello World!'))&lt;br /&gt; &amp;gt; print mbs.getAttribute(ObjectName('com.test:name=TestMgr'), 'PropA')&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Hello World!&lt;/span&gt;&lt;/pre&gt;Or alternatively, we can use the more convenient WLST commands to navigate and manipulate our custom MBean rather than issuing complicated JMX commands:&lt;br /&gt;&lt;pre style=""&gt; &amp;gt; custom()&lt;br /&gt; &amp;gt; ls()&lt;br /&gt;&lt;span style="font-style: italic;"&gt;drw-   com.test&lt;/span&gt;&lt;br /&gt; &amp;gt; cd('com.test')&lt;br /&gt; &amp;gt; ls()&lt;br /&gt;&lt;span style="font-style: italic;"&gt;drw-   com.test:name=TestMgr&lt;/span&gt;&lt;br /&gt; &amp;gt; cd('com.test:name=TestMgr')&lt;br /&gt; &amp;gt; ls()&lt;br /&gt;&lt;span style="font-style: italic;"&gt;-rw-   PropA        Some text&lt;br /&gt;-rw-   PropB        1000&lt;/span&gt;&lt;br /&gt; &amp;gt; print get('PropA')&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Some text&lt;/span&gt;&lt;br /&gt; &amp;gt; set('PropA', 'Hello World!')&lt;br /&gt; &amp;gt; print get('PropA')&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Hello World!&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-size:85%;"&gt;(remember, when in the &lt;span style="font-style:italic;"&gt;custom&lt;/span&gt; tree we can't use the WLST &lt;span style="font-style: italic;"&gt;cmo&lt;/span&gt; variable)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;In summary&lt;/span&gt;, when it comes to creating management interfaces for developed applications hosted on WebLogic, Spring comes into its own, making things much easier and less error prone. Developers can rely on the comfort of a POJO based programming model for development of application management logic in addition to core business logic.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;One final word&lt;/span&gt;. At the start of this blog entry I stated that by exporting custom MBeans to WebLogic's MBean Servers, we can use WebLogic tools like WLST and WLDF for monitoring these custom MBeans. Whilst this is true for custom MBeans in general, it turns out that for WLDF and Spring generated MBeans specifically, there's a slight hitch which means you can't use WLDF to harvest a Spring-generated custom MBean's properties or define a Watch/Notify for these properties. In my next blog entry, I intend to explain why this problem occurs and highlight a simple and re-usable workaround to address this and thus enable Spring-generated custom MBeans to be fully usable with WLDF.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Song for today: Just Because by &lt;a href="http://en.wikipedia.org/wiki/Jane%27s_Addiction"&gt;Jane's Addiction&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-9134474556516255044?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/9134474556516255044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=9134474556516255044' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/9134474556516255044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/9134474556516255044'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2010/02/creating-custom-mbeans-for-weblogic.html' title='Creating Custom MBeans for WebLogic using Spring'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fRAf2L_KiFc/S3ppjIOefgI/AAAAAAAAAE8/btKrYeZrRz0/s72-c/conn1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-4996532609501365451</id><published>2010-02-01T20:18:00.006Z</published><updated>2010-08-08T08:10:41.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Dependency Injection'/><category scheme='http://www.blogger.com/atom/ns#' term='Pitchfork'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>WebLogic and Spring</title><content type='html'>&lt;span style="font-style: italic;"&gt;In this blog topic I describe some of the integration points that WebLogic provides for Spring based applications.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have mixed feelings about &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt;. I definitely prefer its primary focus on the &lt;a href="http://martinfowler.com/articles/injection.html#FormsOfDependencyInjection"&gt;Dependency Injection&lt;/a&gt; pattern (DI) instead of the more typical JavaEE model of using the &lt;a href="http://martinfowler.com/articles/injection.html#UsingAServiceLocator"&gt;Service Locator&lt;/a&gt; pattern (think JNDI lookups). If used the right way, both patterns can help promote loosely coupled and easily unit-testable solutions. However, Spring's prescriptive DI approach makes the process of developing loosely-coupled solutions feel more intuitive and natural. Also, Spring offers an easy way to leverage &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;Aspect Oriented Programming&lt;/a&gt; (AOP) &lt;span style="font-weight: bold;"&gt;when&lt;/span&gt; needed (and yes I emphasise the word &lt;span style="font-style: italic;"&gt;when&lt;/span&gt; - excessive sprinkling of aspects can make applications hard to understand, debug and troubleshoot).&lt;br /&gt;&lt;br /&gt;On the downside, it sometimes feels like Spring has evolved from a light-weight framework for making J2EE  easier, into a vast and  competing component model for building enterprise applications. It's not clear to me how much the balance in Spring has shifted from &lt;span style="font-style: italic;"&gt;Innovating&lt;/span&gt; to &lt;span style="font-style: italic;"&gt;Re-inventing&lt;/span&gt;, and whether this shift is a good thing or not.&lt;br /&gt;&lt;br /&gt;Fortunately, WebLogic makes it pretty easy to deploy Spring based apps, whether your application uses Spring in a &lt;span style="font-style: italic;"&gt;just-enough-dependency-injection&lt;/span&gt; way or in a &lt;span style="font-style: italic;"&gt;use-nearly-every-Spring-feature-under-the-sun&lt;/span&gt; way. On most levels it doesn't really matter what version of Spring you use with a particular version of WebLogic. If you have an issue, you use the Oracle Support organisation for help with WebLogic specific problems and any Spring parts to your application are treated just like your own custom code is, from an Oracle Support perspective.&lt;br /&gt;&lt;br /&gt;In addition, Oracle actually provides explicit certification for specific versions of Spring running on specific versions of WebLogic. For example, on WLS 10.3.x, Oracle explicitly certifies the use of Spring version 2.5.3 (and any later `double-dot' Spring releases). For the official certification matrix, see the spreadsheet titled &lt;span style="font-style: italic;"&gt;System Requirements and Supported Platforms for Oracle WebLogic Server 10.3&lt;/span&gt; on the &lt;a href="http://www.oracle.com/technology/software/products/ias/files/fusion_certification.html"&gt;supported configurations page&lt;/a&gt;. As a matter of interest, it's also worth noting that &lt;a href="http://oss.oracle.com/projects/pitchfork/"&gt;internally&lt;/a&gt;* WebLogic uses elements of Spring and its AOP capabilities to implement some of WebLogic's newer JavaEE features like EJB 3.0, by using the Spring &lt;a href="http://www.springsource.com/pitchfork"&gt;Pitchfork&lt;/a&gt; codebase under the covers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;* WebLogic prefixes the package names of its internally bundled Spring classes to avoid potential class-loading clash issues with Spring classes bundled in any deployed applications. Application developers can also separately choose to bundle the classes from the &lt;a href="http://www.springsource.com/pitchfork"&gt;Spring Pitchfork project&lt;/a&gt; to enable &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e14453/enable_spring.htm"&gt;Spring beans to be injected into Servlets and EJBs&lt;/a&gt; in their own developed application.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;When using an Oracle certified version of Spring with WebLogic, extra integration features are also available to help Spring based applications become &lt;span style="font-style: italic;"&gt;first-class WebLogic citizens&lt;/span&gt;, in the same way that normal JavaEE applications are. This is described in WebLogic's &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e14453/toc.htm"&gt;help documentation on Spring&lt;/a&gt;. By including some &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e14453/enable_console_ext.htm"&gt;boilerplate text in your web-app's Manifest.mf file&lt;/a&gt; to refer to an optional package and by ensuring &lt;span style="font-style: italic;"&gt;WL_HOME/server/lib/weblogic-spring.jar&lt;/span&gt; is first deployed to WebLogic as a shared library, the following &lt;span style="font-weight: bold;"&gt;3 WebLogic features are automatically enabled&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Spring MBeans&lt;/span&gt;. WebLogic automatically generates a set of &lt;a href="http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e13951/mbeans/SpringRuntimeMBean.html?skipReload=true"&gt;Spring related MBeans&lt;/a&gt;, hanging off the normal WebLogic ApplicationRuntimeMBeans, into each server's Runtime Service JMX tree. Examples of these MBeans are SpringRuntimeMBean, SpringApplicationContextRuntimeMBean and SpringTransactionManagerRuntimeMBean. See the &lt;a href="http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e13951/core/index.html"&gt;WebLogic MBean Reference&lt;/a&gt; for more info on these Spring MBeans. The Spring MBeans are read-only and enable administrators to have better visibility into what's going on inside the Spring parts of deployed applications. The screenshot below shows the use of WLST to inspect some of these MBeans. If the &lt;span style="font-style: italic;"&gt;Manifest.mf&lt;/span&gt; file is not correctly defined, WebLogic does not detect the presence of Spring elements in the application and thus will not generate the Spring MBeans; &lt;span style="font-style: italic;"&gt;SpringRuntimeMBean&lt;/span&gt; would not appear in the list of child MBeans shown in the screenshot.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/S171JCZya8I/AAAAAAAAAEM/ienuI94IPBQ/s1600-h/springwlst.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 340px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/S171JCZya8I/AAAAAAAAAEM/ienuI94IPBQ/s400/springwlst.png" alt="" id="BLOGGER_PHOTO_ID_5431047736268057538" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; (click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Spring Console Extension&lt;/span&gt;. WebLogic provides an Admin Console extension for Spring to provide administrators with visual tools for monitoring the Spring parts of deployed applications (first navigate to WebLogic Admin Console's &lt;span style="font-style: italic;"&gt;Preferences | Extension&lt;/span&gt; menu option and and enable &lt;span style="font-style: italic;"&gt;spring-console&lt;/span&gt;). This Spring console extension is basically a set of pages which are added amongst the normal pages of the standard WebLogic admin console, rather than being a separate console per se. The extension provides a view onto the values of the WebLogic generated Spring MBeans (see point 1). If you navigate to the deployed web-app in the Admin Console, select the &lt;span style="font-style: italic;"&gt;Configuration&lt;/span&gt; tab, and then select the &lt;span style="font-style: italic;"&gt;Spring Framework&lt;/span&gt; sub-tab, you will see a read-only view of the contents of the application's Spring application context(s), as shown in the example screenshot below.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fRAf2L_KiFc/S177JgziO_I/AAAAAAAAAEU/qOdTvTC52PA/s1600-h/springconsole1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_fRAf2L_KiFc/S177JgziO_I/AAAAAAAAAEU/qOdTvTC52PA/s400/springconsole1.png" alt="" id="BLOGGER_PHOTO_ID_5431054341498878962" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; (click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In the Deployment's &lt;span style="font-style: italic;"&gt;Monitoring&lt;/span&gt; tab, if you select the &lt;span style="font-style: italic;"&gt;Spring Framework&lt;/span&gt; sub-tab, as shown in the example below, you can drill into read-only views of the types and amounts of Spring beans that have currently been created in the deployed application's Spring application context(s). It also lets you view the WebLogic managed transactions that have been initiated via the Spring library code in the deployed application.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fRAf2L_KiFc/S178U1jV2-I/AAAAAAAAAEc/pplBNvwx9lE/s1600-h/springconsole2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 257px;" src="http://1.bp.blogspot.com/_fRAf2L_KiFc/S178U1jV2-I/AAAAAAAAAEc/pplBNvwx9lE/s400/springconsole2.png" alt="" id="BLOGGER_PHOTO_ID_5431055635558292450" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; (click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;By selecting one of the Spring application contexts listed in this table, you will see statistics showing how many beans have been created in the context, what scope they have and their performance metrics, as shown in the screenshot below.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fRAf2L_KiFc/S179LegMuwI/AAAAAAAAAEk/ru-x8bNrmxU/s1600-h/springconsole3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 247px;" src="http://2.bp.blogspot.com/_fRAf2L_KiFc/S179LegMuwI/AAAAAAAAAEk/ru-x8bNrmxU/s400/springconsole3.png" alt="" id="BLOGGER_PHOTO_ID_5431056574263900930" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt; (click image for larger view)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. WebLogic Injected Spring Beans&lt;/span&gt;. During the start-up process for the &lt;span style="font-style: italic;"&gt;Spring-enabled&lt;/span&gt; web-application (see point 1), WebLogic intercepts the creation of the web-app's normal Spring Application Context (using AOP under the covers), and transparently adds a parent context to the normal context. This parent context is pre-populated with the following 3 WebLogic specific beans, ready to be used by the application:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A WebLoigc Transaction Manager bean (ref="&lt;span style="font-weight: bold;"&gt;transactionManager&lt;/span&gt;") which extends &lt;span style="font-style: italic;"&gt;org.springframework.transaction.jta.JtaTransactionManager&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A WebLogic Edit Server MBean Connection bean (ref="&lt;span style="font-weight: bold;"&gt;editMBeanServerConnection&lt;/span&gt;") which implements &lt;span style="font-style: italic;"&gt;javax.management.MBeanServerConnection&lt;/span&gt;&lt;/li&gt;&lt;li&gt;A WebLogic Runtime Server MBean Connection bean (ref="&lt;span style="font-weight: bold;"&gt;runtimeMBeanServerConnection&lt;/span&gt;") which implements &lt;span style="font-style: italic;"&gt;javax.management.MBeanServerConnection&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;This is mainly just a convenience feature for application developers to use so that they can then refer to these WebLogic-specific beans (using the &lt;span style="font-style: italic;"&gt;ref &lt;/span&gt;ids shown above) and have them injected into application code. For example, we may want to inject a reference to the WebLogic ServerRuntime JMX Server into a piece of our code, to enable the code to then use JMX to inspect the host server's runtime MBeans, using a Spring declaration similar to the following:&lt;pre&gt;&amp;lt;bean id="myTestBean" class="com.acme.MyTestBean"&amp;gt;&lt;br /&gt;   &amp;lt;property name="mbeanSvrConn" ref="&lt;span style="font-weight:bold;"&gt;runtimeMBeanServerConnection&lt;/span&gt;"/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;The exact set of WebLogic beans injected into the parent application context can be deduced by unzipping the file &lt;span style="font-style: italic;font-size:85%;" &gt;WL_HOME/wlserver_10.3/server/lib/weblogic-spring.jar&lt;/span&gt; and viewing the contents of the file &lt;span style="font-style: italic;font-size:85%;" &gt;weblogic/spring/beans/SpringServerApplicationContext.xml&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Using the Spring console extension discussed in point 2, we can actually navigate to and view the contents of the parent application context, at runtime, in addition to the normal app context, as shown in the first two  screenshots in point 2.&lt;br /&gt;&lt;br /&gt;During the application initialisation process, WebLogic also sets the application's default Spring Transaction Manager to be &lt;span style="font-style: italic;"&gt;org.springframework.transaction.jta.WebLogicJtaTransactionManager &lt;/span&gt;to enable WebLogic's Transaction Manager to always be used for managing JTA transactions initiated in Spring code.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Note: A 4th bean (a WebLogic System Work Manager bean) is also populated in the parent context. However, this bean is meant for internal WebLogic system usage and is not for application developers to use, as it does not implement commonj.work.WorkManager. Developers who do want to utilise &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e13733/toc.htm"&gt;WebLogic Work Managers&lt;/a&gt;, should just declare the work managers they require in the WebLogic domain's configuration, in the normal way, and then use &lt;a href="http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/scheduling/commonj/WorkManagerTaskExecutor.html"&gt;org.springframework.scheduling.commonj.WorkManagerTaskExecutor&lt;/a&gt; in their Spring Bean context XML files, to enable the work managers to be injected into application code. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;In summary&lt;/span&gt;, in this blog topic I have described some of the ways that WebLogic handles applications that use Spring. Not all the integration points between WebLogic and Spring have been discussed. For example, I have not described how WebLogic can &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e14453/security.htm"&gt;integrate with Spring Security&lt;/a&gt; (a.k.a. Acegi), how WebLogic's fast RMI/T3 binary wire protocol can be used for Spring Remoting and I have only mentioned in passing the ability to use &lt;a href="http://download.oracle.com/docs/cd/E12839_01/web.1111/e14453/enable_spring.htm"&gt;Spring Dependency Injection into Servlets and EJBs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Footnote: &lt;/span&gt;Brand new in WebLogic 10.3.2 is un-documented and un-supported &lt;span style="font-style: italic;"&gt;tech-preview&lt;/span&gt; support for the &lt;a href="http://blogs.oracle.com/WebLogicServer/2009/12/getting_started_with_weblogic.html"&gt;Service Component Architecture (SCA) using Spring&lt;/a&gt;. This tech-preview uses Spring to wire up the POJOs inside components and composites, and to declaratively specify the invocation protocol bindings for these composites. The WebLogic-Spring capabilities discussed here in my blog entry are unrelated to the SCA tech-preview support.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;Song for today: Rid of Me by &lt;/span&gt;&lt;a style="font-style: italic;" href="http://en.wikipedia.org/wiki/PJ_Harvey"&gt;PJ Harvey&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-4996532609501365451?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/4996532609501365451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=4996532609501365451' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/4996532609501365451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/4996532609501365451'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2010/02/weblogic-and-spring.html' title='WebLogic and Spring'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fRAf2L_KiFc/S171JCZya8I/AAAAAAAAAEM/ienuI94IPBQ/s72-c/springwlst.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-5481324780126863227</id><published>2009-12-11T10:55:00.028Z</published><updated>2010-08-08T17:21:29.390+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='WLDF'/><category scheme='http://www.blogger.com/atom/ns#' term='OEM'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainHealth'/><category scheme='http://www.blogger.com/atom/ns#' term='JMX'/><category scheme='http://www.blogger.com/atom/ns#' term='WLDF Console Extension'/><title type='text'>Deciding to use DomainHealth</title><content type='html'>&lt;a href="http://sourceforge.net/projects/domainhealth"&gt;DomainHealth&lt;/a&gt; (DH) is an open source "zero-config" monitoring tool for WebLogic. It collects important server metrics over time, archives these into CSV files and provides a simple web interface for viewing graphs of current and historical statistics.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;So when should you consider using DomainHealth?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When you don't have a full monitoring solution in place already for your WebLogic environment. Ideally an organisation will have standardised on using &lt;a href="http://www.oracle.com/us/products/enterprise-manager"&gt;Oracle Enterprise Manager&lt;/a&gt; or a 3rd party management tool, for its comprehensive monitoring needs. Oracle Enterprise Manager also caters for various &lt;span style="font-style: italic;"&gt;management&lt;/span&gt; requirements in addition to monitoring, which DH does not. The scope of DH's monitoring capabilities is purely focussed on tracking current and historic usage of certain key server resources. DH is not applicable for profiling your deployed applications (instead see &lt;a href="http://www.oracle.com/technology/products/oem/mgmt_solutions/apm.html"&gt;Oracle AD4J&lt;/a&gt;) or intensively monitoring your JVM (instead see &lt;a href="http://www.oracle.com/technology/products/jrockit/missioncontrol"&gt;Oracle JRockit Mission Control&lt;/a&gt;). However, some organisations using Enterprise Manager may find that DH acts as a convenient and complementary addition to their monitoring solution.&lt;br /&gt;&lt;br /&gt;The most comparable tool to DomainHealth is the &lt;a href="http://download.oracle.com/docs/cd/E12840_01/wls/docs103/wldf_console_ext/index.html"&gt;WebLogic Diagnostic Framework Console Extension&lt;/a&gt; which ships as standard with WebLogic. I use both of these tools in my day to day work, where different situations and requirements dictate the use of one over the other.&lt;br /&gt;&lt;br /&gt;I use &lt;span style="font-weight: bold;"&gt;DomainHealth&lt;/span&gt; (with its built-in WLDF harvesting mechanism) rather than the WLDF Console Extension, in situations where some of the following factors are advantageous:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Zero-configuration&lt;/span&gt;. An administrator does not have to first work out and configure the server objects to monitor. An administrator does not have to spend time creating a complex WLDF module with the correct object types, names and attributes in it. An administrator does not have to work out what graphs to plot and then configure specific graphs for each server in the domain for every new environment (eg. Test, Pre-Prod, Prod1, Prod2).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Minimal performance impact on Managed Servers&lt;/span&gt;. Obtains a set of statistics once and ONLY once, regardless of how many times you come back to view the same statistics in the graphs.  The background statistics collection work is driven from the admin server, once per minute, lasting far less than a second.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Tools friendly storage of statistics in CSV files&lt;/span&gt;. Administrators can open the CSVs in MS Excel or Open Office for off-line analysis and graphing. Using CSV files rather than WebLogic Persistent File Stores on the admin server has no detrimental performance impact. It doesn't matter if it takes 10 microseconds or 100 milliseconds to persist the set of statistics - timeliness only has to be to the nearest minute. The file I/O for writing data to CSV files on the admin server is not in the 'flight-path' of transactions that happen to be racing through the managed servers.&lt;/li&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;Minimal administrator workstation pre-requisites&lt;/span&gt;. Doesn't require Java Applet support on the administrator's workstation; it's browser-friendly and just uses very simple HTML and PNG images to display graphs.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Hot deployable&lt;/span&gt;. Deployable to an already running domain for diagnosis of currently occurring problems, without needing to restart the admin server.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Statistics don't constantly scroll whilst trying to analyse them&lt;/span&gt;. Administrators can focus in on the current window of time or an historic window of time, in a graph, without it continuously refreshing and moving to a later time. A simple set of navigation buttons is provided to move backwards or forwards in time or just go to the most current time.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Statistics can be viewed for non-running Managed Servers&lt;/span&gt;. If a managed server has has just died, graphs of its recent statistics can still be viewed to help diagnose the failure cause, without first requiring the managed server to be recovered and re-started.&lt;/li&gt;&lt;/ol&gt;I use the&lt;span style="font-weight: bold;"&gt; WLDF Console Extension&lt;/span&gt; rather than DomainHealth when  some of the following factors are advantageous:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Infinitely configurable&lt;/span&gt;. Administrators get to choose exactly what server resources they want to monitor.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Fine-grained statistics capture&lt;/span&gt;. Statistics are gathered and displayed at a much higher frequency than just once every minute.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Shipped as part of WebLogic&lt;/span&gt;. No need for an administrator to seek corporate approval to download and provision a 3rd party open source application into the organisation's WebLogic environment.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Statistics can be retrieved for the periods of time when the Admin Server was down&lt;/span&gt;. As long as an administrator has previously configured a WLDF module with the right harvested objects and attributes, statistics can still be retrieved retrospectively, by the Console's graphs, following a period of time when the admin server was down and unable to contact the managed servers.&lt;/li&gt;&lt;/ol&gt;So if DomainHealth sounds like it would be useful, give it a try and let me know your feedback in the forums provided on the project's site (you have to first click the &lt;span style="font-style: italic;"&gt;Develop&lt;/span&gt; menu option for some reason that only SourceForge knows!).&lt;br /&gt;&lt;br /&gt;DomainHealth project home page: &lt;a href="http://sourceforge.net/projects/domainhealth"&gt;http://sourceforge.net/projects/domainhealth&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;DomainHealth help documentation: &lt;a href="http://sourceforge.net/apps/mediawiki/domainhealth"&gt;http://sourceforge.net/apps/mediawiki/domainhealth&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Song for today: Gimme Shelter by &lt;/span&gt;&lt;a style="font-style: italic;" href="http://en.wikipedia.org/wiki/Rolling_stones"&gt;The Rolling Stones&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-5481324780126863227?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/5481324780126863227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=5481324780126863227' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5481324780126863227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5481324780126863227'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2009/12/deciding-to-use-domainhealth.html' title='Deciding to use DomainHealth'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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-1304066656993695443.post-5920275941194356133</id><published>2009-12-10T23:43:00.009Z</published><updated>2010-08-18T11:03:45.303+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainHealth'/><category scheme='http://www.blogger.com/atom/ns#' term='JMX'/><title type='text'>New DomainHealth WebLogic monitoring tool version</title><content type='html'>I've just released the latest version of DomainHealth - version 0.8 (well actually 0.8.1 because of a fix for a last minute bug spotted by &lt;a href="http://kristianjones.blogspot.com/"&gt;Kris&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;DomainHealth (DH) is an open source "zero-config" monitoring tool for WebLogic. It collects important server metrics over time, archives these into CSV files and provides a simple web interface for viewing graphs of current and historical statistics.&lt;br /&gt;&lt;br /&gt;You can download it from the project home page at &lt;a href="http://sourceforge.net/projects/domainhealth"&gt;http://sourceforge.net/projects/domainhealth&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The help docs for DomainHealth are at: &lt;a href="http://sourceforge.net/apps/mediawiki/domainhealth"&gt;http://sourceforge.net/apps/mediawiki/domainhealth&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fRAf2L_KiFc/Sxj571XU2eI/AAAAAAAAAD4/4j-QTm2Jwp4/s1600-h/DHNewShot08.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 207px;" src="http://2.bp.blogspot.com/_fRAf2L_KiFc/Sxj571XU2eI/AAAAAAAAAD4/4j-QTm2Jwp4/s320/DHNewShot08.png" alt="" id="BLOGGER_PHOTO_ID_5411349758618163682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This release includes many minor fixes and enhancements (see the Release Notes document listed alongside the DH download file), plus the following major additions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Now provides the ability to &lt;span style="font-weight: bold;"&gt;harvest and retrieve server statistics using a WLDF&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;module&lt;/span&gt; (configured on the fly by DH), rather than using JMX to poll each server for statistics. This is now the default behaviour when running on WLS version 10.3.x or greater. For WLS versions 9.0 to 10.0.x, it still uses JMX Polling. If you prefer to use JMX Polling for the recent WLS versions, you can force this behaviour with a special parameter (see the Help docs). It is worth noting that, although I don't believe the load that the periodic JMX Polling puts on the managed servers (once a minute),  is noticeable, I was still keen for DH to move to use WLDF by default. This way, DH acts as a WebLogic 'good citizen' and is also able to better cope with the increased number of MBean statistics that inevitably come with each new DH release.&lt;/li&gt;&lt;li&gt;Now shows a lot &lt;span style="font-weight: bold;"&gt;more interesting Thread Pool statistics&lt;/span&gt; on the main page (including Throughput and QueueLength).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Previously, for domains with many servers, it was difficult to drill into the statistics for just one specific server at a time, in the graphical web pages. Now you have the option to&lt;span style="font-weight: bold;"&gt; select which server you want to see on the web page, in isolation&lt;/span&gt;, by selecting the server's name from a drop down list.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When using the WLDF based mechanism for collecting metrics, &lt;span style="font-weight: bold;"&gt;statistics for all Work Managers and all Server Channels&lt;/span&gt; (protocol server sockets) are now also retrieved and displayed. I have not added this capability for the JMX Polling based mechanism because I'm wary of putting too much load on each managed server during the polling process (I may revisit this decision at a later date).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Song for today: Touched by &lt;/span&gt;&lt;a style="font-style: italic;" href="http://en.wikipedia.org/wiki/VAST"&gt;VAST&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-5920275941194356133?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/5920275941194356133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=5920275941194356133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5920275941194356133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5920275941194356133'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2009/12/new-domainhealth-weblogic-monitoring.html' title='New DomainHealth WebLogic monitoring tool version'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fRAf2L_KiFc/Sxj571XU2eI/AAAAAAAAAD4/4j-QTm2Jwp4/s72-c/DHNewShot08.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-471879287084154928</id><published>2009-10-24T07:35:00.004+01:00</published><updated>2010-08-08T08:06:59.274+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='POWLS'/><category scheme='http://www.blogger.com/atom/ns#' term='Wiley'/><category scheme='http://www.blogger.com/atom/ns#' term='Wrox'/><category scheme='http://www.blogger.com/atom/ns#' term='Professional Oracle WebLogic Server'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>New WebLogic book is out</title><content type='html'>A new book titled &lt;span style="font-weight: bold;"&gt;&lt;a href="http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0470484306.html"&gt;Professional Oracle WebLogic Server&lt;/a&gt;&lt;/span&gt; (Wiley/Wrox, 2009) is out now.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/SuGh6oN9kAI/AAAAAAAAADw/m_S55r20nDg/s1600-h/powls.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 249px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/SuGh6oN9kAI/AAAAAAAAADw/m_S55r20nDg/s320/powls.jpg" alt="POWLS Book Front Cover" id="POWLSBookImage" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I am a contributing author having written the &lt;span style="font-weight: bold;"&gt;Web Services chapter (ch.9)&lt;/span&gt;. A colleague of mine, Josh, wrote the Security chapter and the main bulk of the book was written by Robert, Phil and Greg, with Robert pulling the whole thing together into what we hope is a single cohesive and instructive resource (Robert and Phil are colleagues of mine too).&lt;br /&gt;&lt;br /&gt;It's an intermediate to advanced-level, best practices style book aimed at WebLogic Server version 11g (10.3.1). However, for the most part, the content is equally applicable to earlier versions of WebLogic too, from 9.0 onwards, with the notable exception of its EJB 3.0 and JAX-WS 2.1 coverage.&lt;br /&gt;&lt;br /&gt;You can get the book from the &lt;a href="http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0470484306.html"&gt;main book home page&lt;/a&gt;, where you can also download the Table of Contents in PDF form, it you first want to better understand what topics are covered. This home page also includes a link for you to download the book's sample code which includes the Web Services example projects, that I wrote to accompany chapter 9.&lt;br /&gt;&lt;br /&gt;You can also get the book from &lt;a href="http://www.amazon.co.uk/Professional-Oracle-WebLogic-Server-Patrick/dp/0470484306/"&gt;Amazon UK&lt;/a&gt;, &lt;a href="http://www.amazon.com/Professional-Oracle-WebLogic-Server-Patrick/dp/0470484306"&gt;Amazon US&lt;/a&gt; and most other major book retailers out there. Parts of the book can be previewed at &lt;a href="http://books.google.com/books?id=RjedodMJBfUC"&gt;Google Books&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Song for today: I've Made Enough Friends by &lt;/span&gt;&lt;a style="font-style: italic;" href="http://en.wikipedia.org/wiki/The_Wrens"&gt;The Wrens&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-471879287084154928?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/471879287084154928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=471879287084154928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/471879287084154928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/471879287084154928'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2009/10/new-weblogic-book-is-out.html' title='New WebLogic book is out'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fRAf2L_KiFc/SuGh6oN9kAI/AAAAAAAAADw/m_S55r20nDg/s72-c/powls.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-6630451696326099362</id><published>2009-09-03T11:51:00.020+01:00</published><updated>2010-08-08T08:02:08.667+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mission Control'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JRockit'/><category scheme='http://www.blogger.com/atom/ns#' term='Memory Leak'/><category scheme='http://www.blogger.com/atom/ns#' term='Heap'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><category scheme='http://www.blogger.com/atom/ns#' term='JRMC'/><title type='text'>Attempting to Quickly Diagnose Production Memory Leaks with JRockit</title><content type='html'>I just wanted to mention my favourite, not well known, JRockit diagnostic command which I've used a few times recently to resolve tricky JVM heap related issues in production environments.&lt;br /&gt;&lt;br /&gt;Imagine the situation: You've performance tested and tuned your server and application to the hilt, but on day 3 after going live, the production servers are exhibiting excessive heap memory usage issues. You've been pushed into the noisy server room, the pressure's on and the project sponsor is pacing up and down behind you. Until a sys-admin sorts out a non-headless machine for you to run JRockit's Mission Control on, you're stuck with the command line on the production server you've just SSH'd into. You're desperate to be able to just issue a command or two into the shell to quickly see what's happening in the JVM heap before the sys-admin bounces the server to prevent it from going pop with out of memory errors. Well there is such a command that might just save you....&lt;br /&gt;&lt;br /&gt;Using JRockit's &lt;a href="http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/ctrlbreakhndlr.html#wp1001718"&gt;JRCMD&lt;/a&gt; command line tool you can issue a command called &lt;a style="font-style: italic;" href="http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/ctrlbreakhndlr.html#wp1001218"&gt;heap_diagnostics&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This command was new in JRockit R26.4 which was bundled with some of the later WLS 9.x versions and with all WLS versions from 10.0 onwards. It produces a diagnostic text dump of the state of the live JRockit heap, into sys-out of your command shell. The dump includes a summary of the current heap size and heap free, the layout of the native memory used by the JVM, the layout of the JVM's heap, and the state of soft/weak/phantom references and finalizers at the last garbage collection. Most crucially though, the dump also includes the number, percentage and size of every object type currently held in the heap, in order of the largest consumer first. If you suspect a memory leak and look at the names of the classes listed at the top of this list, you have a good chance of very quickly discovering which objects are being leaked. This may not directly point you at the root cause, but it will give you a much better idea of where the problem may lie.&lt;br /&gt;&lt;br /&gt;As an example, to produce a diagnostic dump on a Unix based host environment, run the following commands to: (i) make the JRockit JRE and tools visible to your shell, (ii) determine the operating system's process ID of the WebLogic instance you want to probe, and (iii) generate the diagnostic dump into a text file:&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;$ . /opt/oracle/WLS103/wlserver_10.3/server/bin/setWLSEnv.sh&lt;br /&gt;&lt;br /&gt;$ jps -l | grep weblogic&lt;br /&gt;9681 weblogic.Server&lt;br /&gt;&lt;br /&gt;$ jrcmd 9681 heap_diagnostics &gt; heapdump.txt&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;The command takes a second or two to complete (depending on the current size of your heap and how much is in there). In the environment where I was chasing a memory leak, the dump text file was about 0.5 MB in size, which I've truncated and shown below.&lt;br /&gt;&lt;br /&gt;In this specific example, by looking at the first few entries in the "Detailed Heap Statistics" section of the dump, showing largest heap consumers first, I was able to take an educated guess that the cause of my memory leak was due to some SNMP related classes in the package 'monfox' in WebLogic 10.0.1 rather than in my application code. In my case, having so many of these types of objects in the heap was not to be expected. However in other cases, top consuming objects may be legitimate and not be leaked objects, so this is only a potential indicator. Incidentally, if you need a patch for this specific SNMP issue, raise an Oracle Support case using Metalink refering to Bug#8185278.&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;======== BEGIN OF HEAPDIAGNOSTIC =========================&lt;br /&gt;&lt;br /&gt;Total memory in system: 3434975232 bytes&lt;br /&gt;Available physical memory in system: 2001797120 bytes&lt;br /&gt;-Xmx (maximal heap size) is 536870912 bytes&lt;br /&gt;Heapsize: 536870912 bytes&lt;br /&gt;Free heap-memory: 470024072 bytes&lt;br /&gt;&lt;br /&gt;mmStartCompaction = 0x8c00000, mmEndCompaction = 0xac00000&lt;br /&gt;&lt;br /&gt;Memory layout:&lt;br /&gt;00000000-00002000 ---p 00000000 00:00 0&lt;br /&gt;08048000-08057000 r-xp 00000000 08:06 11421468   /opt/oracle/wls1001/jrockit_150_11/bin/java&lt;br /&gt;08057000-08058000 rwxp 0000f000 08:06 11421468   /opt/oracle/wls1001/jrockit_150_11/bin/java&lt;br /&gt;08060000-080e0000 rwxp 08060000 00:00 0&lt;br /&gt;08100000-08901000 rwxp 08100000 00:00 0&lt;br /&gt;.........truncated.........&lt;br /&gt;&lt;br /&gt;--------- Detailed Heap Statistics: ---------&lt;br /&gt;26.1% 12083k   108775   -541k [C&lt;br /&gt;12.8% 5924k     5586    +18k  [B&lt;br /&gt; 7.2% 3338k   142444    -52k  java/lang/String&lt;br /&gt; 6.4% 2974k    54389     -4k  monfox/toolkit/snmp/util/OidTree$Node&lt;br /&gt; 3.8% 1753k    16028     +0k  [Lmonfox/toolkit/snmp/util/OidTree$Node;&lt;br /&gt; 2.6% 1218k    38978    -39k  monfox/toolkit/snmp/agent/ext/table/SnmpMibTableAdaptor$AdaptorMibNode&lt;br /&gt; 1.2% 555k     7069     +0k   java/lang/Class&lt;br /&gt; 0.5% 225k     3213     -2k   java/util/TreeMap$Entry&lt;br /&gt;.........truncated.........&lt;br /&gt;     46258kB total ---&lt;br /&gt;--------- End of Detailed Heap Statistics ---&lt;br /&gt;&lt;br /&gt;------------------- Printing heap ---------------------&lt;br /&gt;"o"/"p" = 1k normal/pinned objects&lt;br /&gt;"O"/"P" = 50k normal/pinned objects&lt;br /&gt;"."/"/" = &lt;1k normal/pinned objects (fragmentation)&lt;br /&gt;" "/"_" = 1k/50k free space&lt;br /&gt;-------------------------------------------------------&lt;br /&gt;OOOOOOOOOOOOOOOOooooooooooooooooooo.oooooooooooo..      0x8ccb5e8&lt;br /&gt;..o.oooooooooooooooooo.O.............OOooooooooooo      0x8cfb770&lt;br /&gt;ooooooooooo.Oooooooooooooooooooooooooooooooooooooo      0x8d13a28&lt;br /&gt;.........truncated.........&lt;br /&gt;__________________________________________________      0x28a36420&lt;br /&gt;____________________________________                    0x28bfd178&lt;br /&gt;         &lt;br /&gt;-------------- Done printing heap ---------------------&lt;br /&gt;&lt;br /&gt;--- Verbose reference objects statistics - old collection --------&lt;br /&gt;456.7 MB free memory (of 512.0 MB) after last heap GC, finished 0.137 s ago.&lt;br /&gt;Soft references: 326 (146 only soft reachable, 0 cleared this GC)&lt;br /&gt;    java/lang/ref/SoftReference: 215 (140, 0)&lt;br /&gt;           71 ( 32, 0) java/lang/reflect/Method&lt;br /&gt;           45 ( 45, 0) [Ljava/lang/reflect/Method;&lt;br /&gt;.........truncated.........&lt;br /&gt;    Softly reachable referents not used for at least 228.349 s cleared.&lt;br /&gt;Weak references: 15268 (0 cleared this GC)&lt;br /&gt;    java/lang/ref/WeakReference: 12834 (0)&lt;br /&gt;        11355 (  0)    java/lang/Class&lt;br /&gt;          888 (  0)    com/sun/jmx/interceptor/DefaultMBeanServerInterceptor$ListenerWrapper&lt;br /&gt;.........truncated.........&lt;br /&gt;Final handles: 743 (0 pending finalization, 0 became pending this GC)&lt;br /&gt;          244 (  0, 0) java/util/zip/Inflater&lt;br /&gt;          228 (  0, 0) java/util/jar/JarFile&lt;br /&gt;           48 (  0, 0) com/rsa/jsafe/JA_RSAPublicKey&lt;br /&gt;.........truncated.........&lt;br /&gt;Weak object handles: 42096 (0 cleared this GC)&lt;br /&gt;        26308 (  0)    java/lang/String&lt;br /&gt;        12262 (  0)    sun/misc/Launcher$AppClassLoader&lt;br /&gt;.........truncated.........&lt;br /&gt;Phantom references: 366 (330 only phantom reachable, 0 became phantom reachable this GC)&lt;br /&gt;    com/bea/xbean/store/Locale$Ref: 330 (330, 0)&lt;br /&gt;          330 (330, 0) com/bea/xbean/store/Cursor&lt;br /&gt;    jrockit/vm/ObjectMonitor: 22 (0, 0)&lt;br /&gt;            4 (  0, 0) weblogic/work/ExecuteThread&lt;br /&gt;            3 (  0, 0) weblogic/kernel/ServerExecuteThread&lt;br /&gt;.........truncated.........&lt;br /&gt;--- End of reference objects statistics - old collection ---------&lt;br /&gt;&lt;br /&gt;Dark matter: 7207024 bytes&lt;br /&gt;Heap size is not locked&lt;br /&gt;&lt;br /&gt;======== END OF HEAPDIAGNOSTIC ===========================&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Song for today: Turn Around by &lt;a href="http://en.wikipedia.org/wiki/Whiskeytown"&gt;Whiskeytown&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-6630451696326099362?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/6630451696326099362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=6630451696326099362' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6630451696326099362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6630451696326099362'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2009/09/quickly-attempting-to-diagnose.html' title='Attempting to Quickly Diagnose Production Memory Leaks with JRockit'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-3887152396738938941</id><published>2009-06-14T22:02:00.018+01:00</published><updated>2010-08-08T17:20:39.234+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Dispatch'/><category scheme='http://www.blogger.com/atom/ns#' term='Roles Allowed'/><category scheme='http://www.blogger.com/atom/ns#' term='Provider'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services Security'/><category scheme='http://www.blogger.com/atom/ns#' term='JAX-WS'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='WSDL-First'/><title type='text'>Truly Dynamic Web Services on WebLogic using JAX-WS</title><content type='html'>&lt;span style="font-family:arial;"&gt;In my last &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pauldone.blogspot.com/2008/10/web-service-messaging-nirvana.html"&gt;blog&lt;/a&gt;&lt;span style="font-family:arial;"&gt; (a long time ago I know) I talked about the potential for using JAX-WS on WebLogic 10.3 to fulfil the 8 key values that I believe are important for Web Service based Messaging.  I've been using JAX-WS in WebLogic a lot over the last half a year and I've been very impressed with its power. As promised,  I'm now (finally) going to describe the results of my experiments, with JAX-WS Providers/Dispatchers specifically, to see if they can achieve 8 out of 8 on my scorecard. Does JAX-WS give me the power and freedom I desire when doing web services?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;For the experiment, I have used a Customer based web service example, like I've used &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pauldone.blogspot.com/2008/09/wsdl-first-and-schemas-use-global-types.html"&gt;before&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. Using an Interface-First approach, I created a WSDL and associated XSD Schema for a fictitious "Change Customer Information" HTTP SOAP web service. Then I created the Java Web Service (JWS) implementing a JAX-WS Provider interface, rather than using a strongly-typed JAX-WS Service Endpoint Interface (SEI). To test out the integration between the WebLogic's JAX-WS runtime and WebLogic's Security sub-system, I included a WS-Policy in my WSDL to force service consumer applications to provide a WS-Security UserToken (username/password) in the SOAP header for authentication.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;My code for the Provider is shown below:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;@WebServiceProvider(&lt;br /&gt;  serviceName="CustomerInfoChangeService",&lt;br /&gt;  targetNamespace="testns:custinfochngsvc",&lt;br /&gt;  portName="CustomerInfoChangeServiceSOAP",&lt;br /&gt;  wsdlLocation="/WEB-INF/wsdls/CustomerInfoChangeService.wsdl"&lt;br /&gt;)&lt;br /&gt;@ServiceMode(value=Service.Mode.PAYLOAD)&lt;br /&gt;public class CustomerInfoChangeService implements Provider&amp;lt;Source&amp;gt; {&lt;br /&gt;  private final static String XSD_NMSPC = "testns:custinfo";&lt;br /&gt;  @Resource&lt;br /&gt;  private WebServiceContext context;&lt;br /&gt; &lt;br /&gt;  public Source invoke(Source request) {  &lt;br /&gt;    try {&lt;br /&gt;      // Check some security stuff&lt;br /&gt;      System.out.println("Service invoked with principal: " + &lt;br /&gt;                                       context.getUserPrincipal().getName());&lt;br /&gt;      System.out.println("Is in Administrators group? " + &lt;br /&gt;                                     context.isUserInRole("Administrators"));&lt;br /&gt;   &lt;br /&gt;      // Process request&lt;br /&gt;      Transformer transformer = TransformerFactory.newInstance().newTransformer();&lt;br /&gt;      StreamResult sysOutStream = new StreamResult(System.out);&lt;br /&gt;      System.out.println("Changing following customer info:");&lt;br /&gt;      transformer.transform(request, sysOutStream);&lt;br /&gt;      System.out.println();&lt;br /&gt;   &lt;br /&gt;      // INVOKE REAL XML PROCESSING AND CUSTOMER DB UPDATE LOGIC HERE&lt;br /&gt;   &lt;br /&gt;      // Construct response&lt;br /&gt;      String responseText = "&amp;lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&amp;gt;" +&lt;br /&gt;        "&amp;lt;CustomerInfoChangeAcknowledgement xmlns=\"" + XSD_NMSPC + "\"&amp;gt;" +&lt;br /&gt;        "  &amp;lt;Ack&amp;gt;SUCCESS&amp;lt;/Ack&amp;gt;" +&lt;br /&gt;        "  &amp;lt;Comment&amp;gt;Successfully processed change for customer&amp;lt;/Comment&amp;gt;" +&lt;br /&gt;        "&amp;lt;/CustomerInfoChangeAcknowledgement&amp;gt;";&lt;br /&gt;      return new StreamSource(new StringReader(responseText));&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;      throw new WebServiceException("Error in Provider JAX-WS service", e);&lt;br /&gt;    }&lt;br /&gt;  }  &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I bundled this Provider JWS into a plain WAR archive and deployed to WebLogic. I then created the service consumer code as a standalone Java application. The code for this client, which uses the JAX-WS Dispatch API to locate and invoke the remote Web Service, is shown here:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;public class CustomerInfoChangeClient {&lt;br /&gt;  private final static String WSDL_URL_SUFFIX = "?WSDL";&lt;br /&gt;  private final static String WSDL_NMSP = "testns:custinfochngsvc";&lt;br /&gt;  private final static String WSDL_SRVC_PORT = "CustomerInfoChangeServiceSOAP";&lt;br /&gt;  private final static String WSDL_SRVC_NAME = "CustomerInfoChangeService";&lt;br /&gt;  private final static String XSD_NMSP = "testns:custinfo";&lt;br /&gt;  private final static String USERNAME = "weblogic";&lt;br /&gt;  private final static String PASSWORD = "weblogic";&lt;br /&gt; &lt;br /&gt;  public static void main(String[] args) {  &lt;br /&gt;    if (args.length &amp;lt;= 0) {&lt;br /&gt;      throw new IllegalArgumentException("Must provide endpoint URL arg");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;      new CustomerInfoChangeClient(args[0]);&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;      e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public CustomerInfoChangeClient(String endpointURL) throws IOException, &lt;br /&gt;        SAXException, TransformerException, ParserConfigurationException {&lt;br /&gt;    // Construct request&lt;br /&gt;    String requestText = "&amp;lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&amp;gt;" +&lt;br /&gt;                         "&amp;lt;CustomerInfo xmlns=\"" + XSD_NMSP + "\"&amp;gt;" +&lt;br /&gt;                         "  &amp;lt;Id&amp;gt;1&amp;lt;/Id&amp;gt;" +&lt;br /&gt;                         "  &amp;lt;Address1&amp;gt;6&amp;lt;/Address1&amp;gt;" +&lt;br /&gt;                         "  &amp;lt;PostCode&amp;gt;AB1 2YZ&amp;lt;/PostCode&amp;gt;" +&lt;br /&gt;                         "&amp;lt;/CustomerInfo&amp;gt;";&lt;br /&gt;    Source request = new StreamSource(new StringReader(requestText));&lt;br /&gt;&lt;br /&gt;    // Invoke service operation, adding appropriate credentials&lt;br /&gt;    Service service = Service.create(new URL(endpointURL + WSDL_URL_SUFFIX),&lt;br /&gt;                                      new QName(WSDL_NMSP, WSDL_SRVC_NAME));&lt;br /&gt;    Dispatch&amp;lt;Source&amp;gt; dispatcher = service.createDispatch(new QName(&lt;br /&gt;            WSDL_NMSP, WSDL_SRVC_PORT), Source.class, Service.Mode.PAYLOAD);&lt;br /&gt;    Map&amp;lt;Object, String&amp;gt; rc = ((BindingProvider) dispatcher).&lt;br /&gt;                                                     getRequestContext();&lt;br /&gt;    List&amp;lt;CredentialProvider&amp;gt; credProviders = new &lt;br /&gt;                                          ArrayList&amp;lt;CredentialProvider&amp;gt;();&lt;br /&gt;    credProviders.add(new ClientUNTCredentialProvider(USERNAME.getBytes(),&lt;br /&gt;                                                    PASSWORD.getBytes()));&lt;br /&gt;    rc.put(WSSecurityContext.CREDENTIAL_PROVIDER_LIST, credProviders);&lt;br /&gt;    //rc.put(BindingProvider.USERNAME_PROPERTY, USERNAME);&lt;br /&gt;    //rc.put(BindingProvider.PASSWORD_PROPERTY, PASSWORD);&lt;br /&gt;    Source response = dispatcher.invoke(request);&lt;br /&gt;&lt;br /&gt;    // Process response  &lt;br /&gt;    Transformer transformer = TransformerFactory.newInstance().&lt;br /&gt;                                                   newTransformer();&lt;br /&gt;    StreamResult sysOutStream = new StreamResult(System.out);&lt;br /&gt;    System.out.println("Change customer service result:");&lt;br /&gt;    transformer.transform(response, sysOutStream);&lt;br /&gt;    System.out.println();&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Notice that I have not used any generated XML-to-Java classes for the parameters and return values from within the client or in the service itself. Once compiled and run, the client application works completely as expected, and successfully authenticates with the remote web service using the specified username/password WS-Security credentials.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Here are my observations from the experiment:&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-family: arial;"&gt;&lt;li&gt;In the simple example I just used StreamSource for processing the XML request and responses at both ends. However, I could have used other APIs such as DOMSource, JAXBSource, SAXSource, StAXSource from the Java 1.6 standard 'javax.xml.transform' packages instead (and even mixed and matched these for the request and the response).&lt;/li&gt;&lt;li&gt;I have used javax.xml.transform.Source for accessing the SOAP request and response messages, instead of javax.xml.soap.SOAPMessage. With Source I can only access the contents of the SOAP Body (refered to as the 'PAYLOAD'). With SOAPMessage, I can choose to access the XML elements of the SOAP Envelope (including SOAP headers) as well (refered to as the 'MESSAGE'). However using SOAPMessage restricts me to only being able to process XML using the W3C DOM API, therefore using Source appeals to me more. When using Source, if I need to access SOAP Headers, I'd probably just use JAX-WS Protocol Handlers anyway, to process these headers before or after my main Provider class is called.&lt;/li&gt; &lt;li&gt;I don't need to use WebLogic's WSDLC, JWSC or ClientGen Ant tasks because no "build-time" generation of Java classes (using JAXB) or stubs/skeletons is required. For my service, I could have still optionally used JWSC to generate a deployable WAR file with the appropriate web.xml deployment descriptor auto-generated, but I chose to create these artefacts myself, in a way that I can control, using simple Ant build.xml tasks.&lt;/li&gt;  &lt;li&gt;To ensure that my JAX-WS service is detected properly by the WebLogic runtime, the key thing I needed to do was create a Servlet definition and mapping entry in my web.xml deployment descriptor for my JWS Provider class (even though a provider class does not actually implement javax.servlet.Servlet). During deployment, the WebLogic Web Service Container automatically detects that the web.xml declared servlet is infact a JWS class and automatically maps the URL specified to an internal WebLogic JAX-WS handling Servlet called "weblogic.wsee.jaxws.JAXWSWebAppServlet". As a result, my transport-protocol agnostic SOAP JWS class is now exposed over HTTP. My web.xml file includes the following:&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;   &amp;lt;servlet&amp;gt;&lt;br /&gt;      &amp;lt;servlet-name&amp;gt;CustomerInfoChangeService&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;      &amp;lt;servlet-class&amp;gt;test.service.CustomerInfoChangeService&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;   &amp;lt;/servlet&amp;gt;&lt;br /&gt;   &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;      &amp;lt;servlet-name&amp;gt;CustomerInfoChangeService&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;      &amp;lt;url-pattern&amp;gt;/CustomerInfoChangeService&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;   &amp;lt;/servlet-mapping&amp;gt; &lt;/pre&gt;&lt;span style="font-style:italic;font-family:arial;"&gt;[&lt;span style="font-weight:bold;"&gt;UPDATE 19-Jun-09:&lt;/span&gt; Actually after some further testing, I discovered that if I omit the servlet definition/mapping from my web.xml, the JWS Provider web-app still deploys and runs correctly. WebLogic automatically maps the Provider it discovers on deployment, to a URL which is the Provider class's name (without package name prefix and without .class suffix). This is in-line with the JavaEE 1.5 - Servlet 2.5 spec, where deployment descriptors are now optional. However, it may still be desirable to create a servlet definition/mapping in web.xml to be able to better control the URL of the service).]&lt;/span&gt;&lt;ul style="font-family: arial;"&gt;&lt;li&gt;I would have ideally liked to have included a @RolesAllowed() annotation in my Provider class to help declaratively restrict access to service operations based on role. However, the JAX-WS specification doesn't currently cater for this annotation and WebLogic's JAX-WS implementation does not process this annotation, if its included.&lt;/li&gt;&lt;li&gt;In addition to testing authentication using message-level security (eg. a WS-Security user token) I also tested authentication via transport-level security using a client provided HTTP Basic Authentication token (see commented out lines of code in the client app above). In both cases, authentication worked properly, and in my Provider class, when I call context.getUserPrincipal() the proper authenticated principal user object is returned.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;However, when using context.isUserInRole("Administrators")) in my Provider class, "true" is only returned when using transport-level security, but not when using message-level security. This means that for message-level security, performing programmatic access control is currently limited to checking the user principal object only - the user's roles can't be queried. Here was the security role I defined in web.xml:&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;    &amp;lt;security-role&amp;gt;&lt;br /&gt;       &amp;lt;role-name&amp;gt;Administrators&amp;lt;/role-name&amp;gt;&lt;br /&gt;    &amp;lt;/security-role&amp;gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;      ...and here is how I mapped the role to my WebLogic EmbeddedLdap 'Administrators' group in weblogic.xml:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;    &amp;lt;security-role-assignment&amp;gt;&lt;br /&gt;       &amp;lt;role-name&amp;gt;Administrators&amp;lt;/role-name&amp;gt;&lt;br /&gt;       &amp;lt;principal-name&amp;gt;Administrators&amp;lt;/principal-name&amp;gt;&lt;br /&gt;    &amp;lt;/security-role-assignment&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;So to wrap up, how does JAX-WS in WebLogic 10.3 stack up against &lt;/span&gt;&lt;a style="font-family: arial;" href="http://pauldone.blogspot.com/2008/10/web-service-messaging-nirvana.html"&gt;my 8 criteria&lt;/a&gt;&lt;span style="font-family:arial;"&gt;?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Well pretty well actually. I would say &lt;/span&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;7.75 out of 8&lt;/span&gt;&lt;span style="font-family:arial;"&gt;. A full score on the first 7 criteria in the list and on the 8th (integration with the host container's Security Framework), just a 1/4 point dropped. This is due to a lack of full flexibility in defining declarative or programmatic access control for a service, when using message-level authentication.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;Song for today: Festival by &lt;a href="http://en.wikipedia.org/wiki/Sigur_Ros"&gt;Sigur Rós&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-3887152396738938941?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/3887152396738938941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=3887152396738938941' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/3887152396738938941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/3887152396738938941'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2009/06/truly-dynamic-web-services-on-weblogic.html' title='Truly Dynamic Web Services on WebLogic using JAX-WS'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-4675921194603745059</id><published>2008-10-10T12:07:00.026+01:00</published><updated>2010-08-08T17:19:48.287+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Messaging'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services Security'/><category scheme='http://www.blogger.com/atom/ns#' term='JAX-WS'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Postel&apos;s Law'/><category scheme='http://www.blogger.com/atom/ns#' term='WSDL-First'/><title type='text'>Web Service Messaging Nirvana</title><content type='html'>&lt;span style="font-family:arial;"&gt;Web Services and specifically SOAP has got a bad rap in recent years, believed to be yet another over-hyped remote procedure call (RPC) protocol, and not cool enough in light of more current hip approaches like REST. Some of this flak is justified and the SOAP community does itself no favours when it releases a newer version of a spec (SOAP 1.2) which goes out of its way to state that SOAP is no longer an acronym. What next? TAFKAS? (The Artist Formerly Know As SOAP)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Anyway, I digress. I &lt;a href="http://pauldone.blogspot.com/2008/02/web-services-rpc-rest-and-messaging.html"&gt;blogged&lt;/a&gt; in the past about two main areas where SOAP can be used. As you might guess, the main area that interests me is Messaging. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Over the last few years, I've been on a quest to explore how a JavaEE architect and developer can better implement messaging based web services and service consumers in a more loosely coupled and less error prone way. My motivation has been driven by a reaction to the traditional  RPC based Web Services programming model that many have used and still use today and all the problems that such a model brings.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Over time I have constructed a list of 8 key values or principles that I believe are necessary for achieving "Web Services Messaging Nirvana". In most cases, these principals are based more on architectural and development approach, than the specific technology or SOAP toolkit used. However, as always, the two can't be completely divorced from each other..&lt;br /&gt;&lt;br /&gt;Here's my 8 key values:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol style="font-weight: bold;" start="1"&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Promote Interface/Contract-First Development&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;“Implementation-First” leads to tight coupling between the code in the service provider and the code in the service consumer&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;"Implementation First" leads to a strong dependency on the initial SOAP toolkit used for implementation, which is then  difficult to migrate off and leads to the difficulties of vendor lock-in&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol style="font-weight: bold;" start="2"&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Enable a Message-Passing Programming Model&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;RPC programming leads to lots of find grained 'chatty' services where brittle pairings exist between provider and consumer which are resistant to change&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;RPC clients tend to assume endpoints are implementations when in reality, they may just be messaging intermediaries (eg. a service bus)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol style="font-weight: bold;" start="3"&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;De-couple “Service Interface Definition” from “Message Document Definition”&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;In-lining XML type definitions inside a WSDLs prevents re-use of the message structure definitions across multiple web services and other components in the system as a whole (import external Schemas instead)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;The message document structures may already be pre-defined in the organisation (eg. industry-wide standard schemas), so the ability to share these definitions across many web services is required‏&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol style="font-weight: bold;" start="4"&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt; Promote Postel’s Law: “Be conservative in what you do; be liberal in what you accept from others”&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;In other words, allow developers to create services with strongly defined interfaces, yet forgiving implementations&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Service intermediaries and end-points may only care about using part of the message  content - they should not concern themselves about trying to validate other parts of a message&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Enable minor interface version additions without necessarily requiring an upgrade or change to the service provider or service consumer&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol style="font-weight: bold;" start="5"&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Avoid the need for manually generated static stubs and skeletons&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;These are invariably an unnecessary time-consuming addition to the development and build process&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Interface modification always requires re-generation of stubs, skeletons and Java types, forcing service providers and consumers to need to always be corrected, re-compiled and re-deployed.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;A requirement for Skeletons and Stubs is unlikely when generated Java types are not being used in the implementation&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol style="font-weight: bold;" start="6"&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Separate data from the code that operates on it&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Object-oriented programming is great for service implementations but not for de-coupling disparate elements of the higher level distributed systems that are based on the principle of passing messages or events around&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;Enable message data to be passed between systems without one system caring about or pre-empting how the other system may use and operate on the message’s content&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol style="font-weight: bold;" start="7"&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt; Provide the developer with a choice of XML Tools to use&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;SOAP Toolkits which force messages to be marshalled into a strongly typed Java graph of objects, results in one and only one way that the programmer can operate on the data&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;If only part of a message is required or performance is key, a developer should have the option to use a SAX parser, a Streaming parser or just an XPath based Java API to query and operate on the data&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;If XQuery or XSLT offers some developers a better abstraction and quicker development process then don't prevent a developer from being able plug in this option&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Retain the choice of being able to generate strongly types Java objects for situations where the developer needs or prefers it, but enable the developer to choose the technology (eg. JAXB, XmlBeans)‏&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol start="8" style="font-family: arial; font-weight: bold;"&gt;&lt;li&gt;Integrate with the host container's Security Framework for Web Services Security&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul style="font-family: arial;"&gt;&lt;li&gt;For an application server based production environment, the server's Security Framework is already likely to be plugged into the organisation's larger security infrastructure (inc. LDAP, Kerberos, PKI and other elements) to provide full support for  authentication, access control, single sign-on, identity propagation, encryption and signing. This infrastructure needs to be leveraged by the SOAP Toolkit, not ignored&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The SOAP Toolkit needs to delegate to, or at least share its security context with, the host container, especially for its support of WS-Security and SAML&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;In the past, with J2EE 1.2, 1.3 and 1.4 compatible application servers, these values have been very hard to achieve with the application server's built-in SOAP support (ie. JAX-RPC - oriented around the concept of RPC, skeletons, stubs, and generated Java types) or with a Third-Party SOAP Toolkit (eg Apache Axis - little integration with the container's underlying Security Framework).&lt;br /&gt;&lt;br /&gt;As a result, on these platforms, I've struggled to be able to get anywhere near achieving my goal of hitting the 8 key values of my Web Service quest.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;JavaEE 1.5 introduced the JAX-WS API which is the newer Web Services toolkit for JavaEE developers. The focus of this standard, in my opinion, is still largely based on RPC and generated Java types. However, it does offer a glimmer of hope in form of the option of using a 'dnyamic' server side API (Provider interface) and client-side API (Dispatcher interface).&lt;br /&gt;&lt;br /&gt;To my eyes the Provider/Dispatcher facility could finally give me a chance of achieving the 8 key values in a &lt;u&gt;real&lt;/u&gt; Web Services based solution.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Version 10.0 of WebLogic was the first version to introduce JAX-WS, but at the time lacked integration with WebLogic's Security Framework and WS-Security and SAML support, thus lessening its relevance to many solutions where securing web services was a key requirement.  Many users continued to use WebLogic's JAX-RPC stack due to the need to leverage Weblogic security. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Things have now changed and the JAX-WS implementation in version 10.3 of WebLogic should address this. I hope to blog soon about my experiments with &lt;/span&gt;&lt;span style="font-family:arial;"&gt;JAX-WS Providers/Dispatchers in &lt;/span&gt;&lt;span style="font-family:arial;"&gt;WebLogic 10.3 and my quest to realise my 8 key values of Web Services Messaging Nirvana.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-family:arial;" &gt;Song for today: Burn Baby by &lt;/span&gt;&lt;a style="font-family: arial; font-style: italic;" href="http://www.last.fm/music/Mother+Tongue"&gt;Mother Tongue&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-4675921194603745059?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/4675921194603745059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=4675921194603745059' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/4675921194603745059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/4675921194603745059'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2008/10/web-service-messaging-nirvana.html' title='Web Service Messaging Nirvana'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-4013394209247094611</id><published>2008-09-05T13:48:00.034+01:00</published><updated>2010-08-08T17:18:41.853+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Global Element'/><category scheme='http://www.blogger.com/atom/ns#' term='Schema'/><category scheme='http://www.blogger.com/atom/ns#' term='JAX-WS'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Global Type'/><category scheme='http://www.blogger.com/atom/ns#' term='WSDL-First'/><category scheme='http://www.blogger.com/atom/ns#' term='WSDL'/><category scheme='http://www.blogger.com/atom/ns#' term='Code-First'/><title type='text'>WSDL-First and Schemas: Use Global Types or Global Elements?</title><content type='html'>&lt;span style="font-family:arial;"&gt;Often I'm faced with needing to expose a Web Service where the request and response bodies are messages, based on a well established shape that is not just the concern of the specific Web Service. The message received by the Web Service is likely to flow through other parts of the internal system 'behind' the service endpoint. The Schemas for these messages are not specific to just the Web Service WSDL but are also used by other internal components which have to deal with XML. Often these Schemas are pre-defined across an organisation or by third-parties (eg. the &lt;a href="http://xml.coverpages.org/ni2002-01-18-a.html"&gt;ARTS IXRetail&lt;/a&gt; schema for the Retail industry).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;With these sorts of scenarios, a “WSDL first” approach is usually required for creating or generating Web Service end-points, where the WSDL identifies the shape of the service request and response bodies, but does not directly define this shape. Instead, the WSDL imports the externally held Schemas and references entities from the Schema to declare the format of the top-level nodes for a SOAP message body.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;With this in mind, when designing Schemas that will be used by WSDLs and other XML components, I've been trying to work out whether top-level schema entities should be defined as Global Types or as Global Elements.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;So I tried a little experiment, using a simple home-made schema to represent a Customer, including Name, Date of Birth, Addresses and Telephone Numbers. I created a SOAP Web Service which enables a Customer's personal information to be retrieved by providing the customer's name as the search criteria in the SOAP request.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;First I tried using a Global Type in my Customer schema (Customer.xsd) to represent the shape of the top level request XML (CustomerSearchCrtieria) and response XML (Customer), as follows:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;schema ....&amp;gt;&lt;br /&gt;&amp;lt;complexType name="CustomerSearchCriteria"&amp;gt;&lt;br /&gt;    &amp;lt;sequence&amp;gt;&lt;br /&gt;        &amp;lt;element name="FirstName" type="tns:FirstName"/&amp;gt;&lt;br /&gt;        &amp;lt;element name="LastName" type="tns:LastName"/&amp;gt;&lt;br /&gt;    &amp;lt;/sequence&amp;gt;&lt;br /&gt;&amp;lt;/complexType&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;complexType name="Customer"&amp;gt;&lt;br /&gt;    &amp;lt;sequence&amp;gt;&lt;br /&gt;        &amp;lt;element name="FirstName" type="tns:FirstName"/&amp;gt;&lt;br /&gt;        &amp;lt;element name="LastName" type="tns:LastName"/&amp;gt;&lt;br /&gt;        &amp;lt;element name="DateOfBirth" type="tns:DateOfBirth"/&amp;gt;&lt;br /&gt;        &amp;lt;element name="Address" type="tns:Address" minOccurs="0" maxOccurs="unbounded"/&amp;gt;&lt;br /&gt;        &amp;lt;element name="Telephone" type="tns:TelephoneNumber" minOccurs="0" maxOccurs="unbounded"/&amp;gt;&lt;br /&gt;    &amp;lt;/sequence&amp;gt;&lt;br /&gt;&amp;lt;/complexType&amp;gt;&lt;br /&gt;....&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;In the WSDL, I defined the request and response message parts to use the two Global Types from the imported schemas, as follows:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;wsdl:definitions name="CustomerInfoService" ... xmlns:cust="http://www.example.org/Customer"&amp;gt;&lt;br /&gt;&amp;lt;wsdl:types&amp;gt;&lt;br /&gt;    &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;        &amp;lt;xsd:import namespace="http://www.example.org/Customer" schemaLocation="./Customer.xsd"/&amp;gt;&lt;br /&gt;    &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;&amp;lt;/wsdl:types&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;wsdl:message name="GetCustomerInfoRequest"&amp;gt;&lt;br /&gt;    &amp;lt;wsdl:part name="MyCustomerSearchCriteria" type="cust:CustomerSearchCriteria"/&amp;gt;&lt;br /&gt;&amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;wsdl:message name="GetCustomerInfoResponse"&amp;gt;&lt;br /&gt;    &amp;lt;wsdl:part name="MyCustomer" type="cust:Customer"/&amp;gt;&lt;br /&gt;&amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;....&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;Then when I fired a SOAP request into the service using my test harness, the SOAP request contained the following (notice no namespace for top level element in the body):&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;soapenv:Envelope ....&amp;gt;&lt;br /&gt;&amp;lt;soap:Header ..../&amp;gt;&lt;br /&gt;&amp;lt;soapenv:Body&amp;gt;&lt;br /&gt;    &amp;lt;MyCustomerSearchCriteria xmlns:cus="http://www.example.org/Customer"&amp;gt;&lt;br /&gt;        &amp;lt;cus:FirstName&amp;gt;Paul&amp;lt;/cus:FirstName&amp;gt;&lt;br /&gt;        &amp;lt;cus:LastName&amp;gt;Done&amp;lt;/cus:LastName&amp;gt;&lt;br /&gt;    &amp;lt;/MyCustomerSearchCriteria&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Body&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Envelope&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;The SOAP response contained the following (notice no namespace for top level element in the body):&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;soapenv:Envelope ....&amp;gt;&lt;br /&gt;&amp;lt;soap:Header  ..../&amp;gt;&lt;br /&gt;&amp;lt;soapenv:Body&amp;gt;&lt;br /&gt;    &amp;lt;MyCustomer xmlns:cus="http://www.example.org/Customer"&amp;gt;&lt;br /&gt;        &amp;lt;cus:FirstName&amp;gt;Paul&amp;lt;/cus:FirstName&amp;gt;&lt;br /&gt;        &amp;lt;cus:LastName&amp;gt;Done&amp;lt;/cus:LastName&amp;gt;&lt;br /&gt;        &amp;lt;cus:DateOfBirth&amp;gt;1973-12-12&amp;lt;/cus:DateOfBirth&amp;gt;&lt;br /&gt;        &amp;lt;cus:Address&amp;gt;&lt;br /&gt;            &amp;lt;cus:HouseNumber&amp;gt;1&amp;lt;/cus:HouseNumber&amp;gt;&lt;br /&gt;            &amp;lt;cus:Street&amp;gt;High Street&amp;lt;/cus:Street&amp;gt;&lt;br /&gt;            &amp;lt;cus:Town&amp;gt;Big Town&amp;lt;/cus:Town&amp;gt;&lt;br /&gt;            &amp;lt;cus:Postcode&amp;gt;BT1 1AZ&amp;lt;/cus:Postcode&amp;gt;&lt;br /&gt;        &amp;lt;/cus:Address&amp;gt;&lt;br /&gt;        &amp;lt;cus:Telephone&amp;gt;&lt;br /&gt;            &amp;lt;cus:AreaCode&amp;gt;0111&amp;lt;/cus:AreaCode&amp;gt;&lt;br /&gt;            &amp;lt;cus:LocalNumber&amp;gt;1234561&amp;lt;/cus:LocalNumber&amp;gt;&lt;br /&gt;        &amp;lt;/cus:Telephone&amp;gt;&lt;br /&gt;    &amp;lt;/MyCustomer&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Body&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Envelope&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;As you can see, the resulting top level XML element inside the SOAP body for both the request and the response is NOT part of the same namespace at the rest of the message XML. This is because the top-level element has actually been defined as an element by the WSDL, rather than being defined externally in the schema itself. To me this is less than ideal because I believe most people would want the whole message to have the same namespace.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;In addition I believe most people would want the top level nodes to have an element name mandated by the Schema, not by the WSDL (eg. the top level element should be forced to be 'Customer' and not 'MyCustomer').&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;So I then tried using a Global Element instead, in my Customer schema (Customer.xsd) to represent the shape of the top level request XML (CustomerSearchCrtieria) and response XML (Customer), as follows:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;schema ...&amp;gt;&lt;br /&gt;&amp;lt;element name="CustomerSearchCriteria" type="tns:CustomerSearchCriteria"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;element name="Customer" type="tns:Customer"/&amp;gt;&lt;br /&gt;....&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;In the WSDL, I defined the request and response message parts to use the two Global Elements from the schemas, as follows:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;wsdl:definitions name="CustomerInfoService" .... xmlns:cust="http://www.example.org/Customer"&amp;gt;&lt;br /&gt;&amp;lt;wsdl:types&amp;gt;&lt;br /&gt;    &amp;lt;xsd:schema&amp;gt;&lt;br /&gt;        &amp;lt;xsd:import namespace="http://www.example.org/Customer" schemaLocation="./Customer.xsd"/&amp;gt;&lt;br /&gt;    &amp;lt;/xsd:schema&amp;gt;&lt;br /&gt;&amp;lt;/wsdl:types&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;wsdl:message name="GetCustomerInfoRequest"&amp;gt;&lt;br /&gt;    &amp;lt;wsdl:part element="cust:CustomerSearchCriteria" name="parameters"/&amp;gt;&lt;br /&gt;&amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;wsdl:message name="GetCustomerInfoResponse"&amp;gt;&lt;br /&gt;    &amp;lt;wsdl:part element="cust:Customer" name="parameters"/&amp;gt;&lt;br /&gt;&amp;lt;/wsdl:message&amp;gt;&lt;br /&gt;....&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;Then when I fired a SOAP request into the service using my test harness, the SOAP request contained the following:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;soapenv:Envelope ....&amp;gt;&lt;br /&gt;&amp;lt;soap:Header ..../&amp;gt;&lt;br /&gt;&amp;lt;soapenv:Body&amp;gt;&lt;br /&gt;    &amp;lt;cus:CustomerSearchCriteria xmlns:cus="http://www.example.org/Customer"&amp;gt;&lt;br /&gt;        &amp;lt;cus:FirstName&amp;gt;Paul&amp;lt;/cus:FirstName&amp;gt;&lt;br /&gt;        &amp;lt;cus:LastName&amp;gt;Done&amp;lt;/cus:LastName&amp;gt;&lt;br /&gt;    &amp;lt;/cus:CustomerSearchCriteria&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Body&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Envelope&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;The SOAP response contained the following:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;soapenv:Envelope ....&amp;gt;&lt;br /&gt;&amp;lt;soap:Header ..../&amp;gt;&lt;br /&gt;&amp;lt;soapenv:Body&amp;gt;&lt;br /&gt;    &amp;lt;cus:Customer xmlns:cus="http://www.example.org/Customer"&amp;gt;&lt;br /&gt;        &amp;lt;cus:FirstName&amp;gt;Paul&amp;lt;/cus:FirstName&amp;gt;&lt;br /&gt;        &amp;lt;cus:LastName&amp;gt;Done&amp;lt;/cus:LastName&amp;gt;&lt;br /&gt;        &amp;lt;cus:DateOfBirth&amp;gt;1973-12-12&amp;lt;/cus:DateOfBirth&amp;gt;&lt;br /&gt;        &amp;lt;cus:Address&amp;gt;&lt;br /&gt;            &amp;lt;cus:HouseNumber&amp;gt;1&amp;lt;/cus:HouseNumber&amp;gt;&lt;br /&gt;            &amp;lt;cus:Street&amp;gt;High Street&amp;lt;/cus:Street&amp;amp;&lt;br /&gt;            &amp;lt;cus:Town&amp;gt;Big Town&amp;lt;/cus:Town&amp;gt;&lt;br /&gt;            &amp;lt;cus:Postcode&amp;gt;BT1 1AZ&amp;lt;/cus:Postcode&amp;gt;&lt;br /&gt;        &amp;lt;/cus:Address&amp;gt;&lt;br /&gt;        &amp;lt;cus:Telephone&amp;gt;&lt;br /&gt;            &amp;lt;cus:AreaCode&amp;gt;0111&amp;lt;/cus:AreaCode&amp;gt;&lt;br /&gt;            &amp;lt;cus:LocalNumber&amp;gt;1234561&amp;lt;/cus:LocalNumber&amp;gt;&lt;br /&gt;        &amp;lt;/cus:Telephone&amp;gt;&lt;br /&gt;    &amp;lt;/cus:Customer&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Body&amp;gt;&lt;br /&gt;&amp;lt;/soapenv:Envelope&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;As you can now see, all of the elements in the XML message, contained within the request and response SOAP bodies, now have the same namespace and the top level element name is defined by the Schema rather than by the WSDL. This is much more desirable in my view.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;In summary, when dealing with Web Services in a “WSDL-first” scenario and using externally defined schemas, I would recommend defining Global Elements in the Schema and then referencing these elements from a WSDL, rather than using Global Types. This enables the complete message to share the same namespace and enables all elements (and their names), in the message, to be completely defined and enforced by the Schema.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;Note: I am not necessarily making a recommendation to use Global Elements over Global Types in all circumstances, rather, just in situations where a Schema could possibly be used directly by a SOAP Web Service description file (WSDL).in addition to other parts of a system.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-style:italic;"&gt;Soundtrack for today: Gouge Away by &lt;a href="http://en.wikipedia.org/wiki/The_Pixies"&gt;Pixies&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-4013394209247094611?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/4013394209247094611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=4013394209247094611' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/4013394209247094611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/4013394209247094611'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2008/09/wsdl-first-and-schemas-use-global-types.html' title='WSDL-First and Schemas: Use Global Types or Global Elements?'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-6399676978090699147</id><published>2008-08-21T09:55:00.043+01:00</published><updated>2010-08-18T11:08:59.057+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hugemem'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JRockit'/><category scheme='http://www.blogger.com/atom/ns#' term='64-bit'/><category scheme='http://www.blogger.com/atom/ns#' term='hotspot'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='32-bit'/><category scheme='http://www.blogger.com/atom/ns#' term='PermGen'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='maximum heap size'/><category scheme='http://www.blogger.com/atom/ns#' term='Heap'/><category scheme='http://www.blogger.com/atom/ns#' term='PAE'/><category scheme='http://www.blogger.com/atom/ns#' term='solaris'/><title type='text'>Is a JVM's Maximum Heap Size really 1.7 GB?</title><content type='html'>Many claim that the maximum heap size for a JVM is 1.7 GB, but is this really true?&lt;br /&gt;&lt;br /&gt;Well yes and no....&lt;br /&gt;&lt;br /&gt;Probably yes, where in most cases the person asking the question is a developer using a Windows based PC. Invariably, the PC uses a Windows 32-bit OS on 32 bit hardware and the JVM in use is Sun's 32-but Hotspot JVM. However, start to change any of these host environment characteristics and the maximum heap size limit can vary significantly.&lt;br /&gt;&lt;br /&gt;In many production scenarios, the characteristics of the host environment are very different from development, such as having a 64-bit OS on 64-bit hardware (eg. Solaris/SPARC). However, its often only the developers and not the system administrators that understand the subtleties of JVM memory management to any significant degree, so the whole discussion gets lost and everyone ends up assuming 1.7GB is a hard heap size limit across the board..&lt;br /&gt;&lt;br /&gt;So here's my attempt to map out the actual maximum heap sizes a little more clearly. Hopefully the figures in the table below are pretty accurate. I've tested many of these variables, but I've not had the luxury of having an environment to test them all. So please correct me if you have evidence of discrepancies.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fRAf2L_KiFc/SK1EFD1bFyI/AAAAAAAAADI/UeEG5rPDJ2U/s1600-h/maxheap_table.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 502px; height: 158px;" src="http://3.bp.blogspot.com/_fRAf2L_KiFc/SK1EFD1bFyI/AAAAAAAAADI/UeEG5rPDJ2U/s1600/maxheap_table.png" alt="Max Heap Sizes Table" id="BLOGGER_PHOTO_ID_5236916795421169442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The table assumes that the host machine has sufficient physical RAM installed and that other OS processes aren't consuming a significant portion of the available memory. It is assumed that the 64-bit OS is Windows, Linux or Solaris, the 32-bit hardware is x86 and the 64-bit hardware is x86-64, IA-64 or SPARC. Other operating system or hardware architectures may have different subtleties.&lt;br /&gt;&lt;br /&gt;Depending on the JVM you use, your mileage may vary. For example, JRockit is pretty good at being able to hit the maximum heap size limits listed, whereas inherent limitations in other JVMs may prevent this.&lt;br /&gt;&lt;br /&gt;It is worth discussing the Windows /3G boot option (with &lt;a href="http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx"&gt;PAE&lt;/a&gt;) a little further. Most JVMs, like Sun Hotspot 1.6, require a contiguous memory space. Using the /3G option on Windows does not guarantee a single contiguous memory space dedicated to a single process. Therefore, this option cannot be used by JVMs that cannot cope with non-contiguous memory and these JVMs thus have a maximum heap size of 1.7 GB. JRockit can handle non-contiguous memory and therefore can use the /3G option on Windows, enabling a maximum heap size of approximately 2.7 GB.&lt;br /&gt;&lt;br /&gt;Why the difference between maximum OS process size and maximum heap size?&lt;br /&gt;&lt;br /&gt;Well the memory used by a JVM process is not just composed of heap. It is also made up of JVM internal structures, generated code, loaded native libraries and thread stacks which are all a lot less predictable in size. As a result, the stated maximum JVM process memory size can only ever be approximate allowing some headroom for non-heap memory usage. The more native C libraries your Java application uses and the more threads your application uses, then the more the memory, outside of the heap, will be consumed. Also, some JVMs, like Sun Hotspot, store class definitions outside of the heap (eg.  in a “Perm Space”), further adding to the size of a JVM process over and above the maximum heap size.&lt;br /&gt;&lt;br /&gt;So even though the figures in the table are achievable in certain circumstances, the actual choice of JVM and the nature of the hosted Java application and its usage of non-heap based memory may mean, in practice, that you are not able to get close to achieving the indicated maximum heap size for your application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Supporting References:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[1] &lt;/span&gt;&lt;a href="http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx"&gt;http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.sun.com/moazam/entry/why_can_t_i_allocate"&gt;http://blogs.sun.com/moazam/entry/why_can_t_i_allocate&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4358809"&gt;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4358809&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;[2] &lt;/span&gt;&lt;a href="http://blogs.oracle.com/jrockit/2008/09/how_to_get_almost_3_gb_heap_on_windows.html"&gt;http://blogs.oracle.com/jrockit/2008/09/how_to_get_almost_3_gb_heap_on_windows.html&lt;/a&gt; (updated link following the move of the linked content from the old Dev2Dev site - 30-Jan-09)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;[3] &lt;/span&gt;&lt;a href="http://java.sun.com/docs/hotspot/HotSpotFAQ.html#gc_heap_32bit"&gt;http://java.sun.com/docs/hotspot/HotSpotFAQ.html#gc_heap_32bit&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Soundtrack for today: Radio Protector by &lt;/span&gt;&lt;a style="font-style: italic;" href="http://en.wikipedia.org/wiki/65daysofstatic"&gt;65daysofstatic&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-6399676978090699147?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/6399676978090699147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=6399676978090699147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6399676978090699147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6399676978090699147'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2008/08/is-jvms-maximum-heap-size-really-17-gb.html' title='Is a JVM&apos;s Maximum Heap Size really 1.7 GB?'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fRAf2L_KiFc/SK1EFD1bFyI/AAAAAAAAADI/UeEG5rPDJ2U/s72-c/maxheap_table.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-5362196611700755666</id><published>2008-05-08T20:29:00.007+01:00</published><updated>2010-08-08T17:17:04.882+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='WLDF'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainHealth'/><category scheme='http://www.blogger.com/atom/ns#' term='JMX'/><title type='text'>Domain Health tool Vs WLDF for monitoring</title><content type='html'>&lt;span style="font-style: italic;"&gt;[Originally posted on my old BEA Dev2Dev &lt;/span&gt;&lt;a style="font-style: italic;" href="http://dev2dev.bea.com/pub/au/3316"&gt;blog&lt;/a&gt;&lt;span style="font-style: italic;"&gt; on May 8, 2008]&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Note added 11-Dec-2009: The content of this blog entry is generally superseded by a newer blog &lt;/span&gt;&lt;a style="font-style: italic;" href="http://pauldone.blogspot.com/2009/12/deciding-to-use-domainhealth.html"&gt;entry&lt;/a&gt;&lt;span style="font-style: italic;"&gt; which addresses the differences since the introduction of the WLDF harvesting capability to DomainHealth.&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;p style="font-family: arial;"&gt;&lt;b&gt;DomainHealth&lt;/b&gt; is an open source "zero-config" monitoring tool for BEA's WebLogic Application Server. It collects important server runtime statistics over time for all servers in a domain, archives this data into CSV files and provides a simple Web Browser based interface for viewing graphs of statistics, historically.&lt;/p&gt;        &lt;p style="font-family: arial;"&gt;Version 0.7 has just been released and is available to download and use on WebLogic 9.x/10.x from the project's home page at: &lt;a href="http://sourceforge.net/projects/domainhealth"&gt;http://sourceforge.net/projects/domainhealth&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: arial;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_fRAf2L_KiFc/SIXdTQ9hkhI/AAAAAAAAABM/Rr8-mY3hbu0/s1600-h/dhnew.png"&gt;&lt;img style="cursor: pointer; width: 350px; height: 207px;" src="http://bp1.blogger.com/_fRAf2L_KiFc/SIXdTQ9hkhI/AAAAAAAAABM/Rr8-mY3hbu0/s320/dhnew.png" alt="" id="BLOGGER_PHOTO_ID_5225826265673601554" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;&lt;b&gt;Some people have asked why I have created the DomainHealth tool when WebLogic already provides the WebLogic Diagnostic Framework (WLDF). This is a good question which I will attempt to answer below.&lt;/b&gt;&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;First of all it is worth considering that monitoring can be divided into many sub-categories, three of which are:&lt;/p&gt; &lt;ol style="font-family: arial;"&gt;&lt;li&gt;Alerting of a potential issue which is about to occur or has just occurred (eg. not much memory left) enabling the administrator to take pro-active or remedial action&lt;/li&gt;&lt;li&gt;Real-time statistics capture and viewing, so an administrator can instantly gauge the health of his/her applications and systems&lt;/li&gt;&lt;li&gt;Continuous harvesting of application and system data over time to enable administrators to retrospectively analyse trends (eg. to identify potential tunings), and to diagnose the cause of fatal problems after the problem has occurred.&lt;/li&gt;&lt;/ol&gt;  &lt;p style="font-family: arial;"&gt;...plus many others like instrumenting, profiling, heartbeating.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;WLDF in combination with the "WLDF Console Extension" provides the base technology to enable administrators to configure a set of WebLogic servers and environment which caters for all 3 monitoring capabilities listed above.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;The philosophy of DomainHealth is "zero-config" and as such is intended for a certain type of user base for certain types of monitoring needs (ie. mainly point (3) and to a lesser extent point (2) above). For users who require more complex customisable monitoring capabilities, the WebLogic Diagnostic Framework (WLDF) is more likely to provide the capabilities desired. In some environments, a combination of using WLDF for (1) and DomainHealth for (2) and (3) may also be an option to consider.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Here's a list of benefits which I see for using Domain Health and for using WLDF and the WLDF Console Extension....&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Domain Health (DH) benefits:&lt;/p&gt;  &lt;ul style="font-family: arial;"&gt;&lt;li&gt;DH is easier to install (hot deploy of WAR to admin server) than WLDF which requires copying a JAR file to a specific path and then re-starting the admin server. The WLDF deployment process may be problematic when needing to retrospectively add monitoring capabilities to a production system which has already gone live.&lt;/li&gt;&lt;li&gt;DH in most case requires no configuration. WLDF console has some built-in views which helps shorten the number of configuration steps likely to be required, However it is unlikely that WLDF's built-in views will be sufficient on their own. By default, the WLDF Console shows data cached on the live servers. For the WLDF Console to show historic data, the administrator must first manually configure (or more likely script the configuration) of a WLDF harvester, separately, to enable historical data to then be retrieved and shown in the console.&lt;/li&gt;&lt;li&gt;For current data, WLDF Console periodically polls the cache for live data and for historic data has to contact each server's WLDF Data Accessor to retrieve data from each server's local WLDF archive files. Overall, the performance impact of this process is likely to negate some of the performance gain, from not needing to poll servers remotely to harvest their properties in the first place.&lt;/li&gt;&lt;li&gt;The CSV output of DH is more friendly to generic third-party tools than WLDF is. For offline retrieval of WLDF archived data for use in such tools, scripting will be required to integrate Jython/WLST with the third-party tools.&lt;/li&gt;&lt;li&gt;DH's web-based visual display is more lightweight than the WLDF console extension for administrators, requiring just a simple browser rather than also needing a Java browser plugin to be installed.&lt;/li&gt;&lt;/ul&gt;  &lt;p style="font-family: arial;"&gt;WLDF (inc WLDF Console) benefits:&lt;/p&gt;  &lt;ul style="font-family: arial;"&gt;&lt;li&gt;WLDF is infinitely configurable allowing administrators to track the exact server statistics that they are interested in. For DH, you are stuck with what has been prescribed as a suitable set of statistics.&lt;/li&gt;&lt;li&gt;A WLDF thread runs within each managed server for property retrieval, rather than requiring remote polling from an admin server. This may lessen any potential performance impact of performing monitoring in a live environment (however this gain is at least partly lost when using the WLDF console running on the Admin Server to then view data - this requires each server to be contacted to retrieve its locally archived statistics).&lt;/li&gt;&lt;li&gt;WLDF and the WLDF console are far more powerful and extensive in terms of the overall monitoring features that they provide (eg. provides visualisation for instrumentation of running code).&lt;/li&gt;&lt;/ul&gt;  &lt;p style="font-family: arial;"&gt;It is also worth noting that DomainHealth is not a replacement for a 'fully-fledged' 'off-the-shelf' Server monitoring and management tool. Such tools are usually more capable and able to capture other statistics (eg. hardware, OS and network stats) in addition, to enable a more holistic picture of the health of a server environment to be captured. However, in cases where budget does not stretch to purchase an off-the-shelf solution for production environments or where a quick and easy tool for monitoring performance in performance test environments, is required, DomainHealth may help to fill the gap.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt; &lt;/p&gt;  &lt;p style="font-family: arial;"&gt;In summary what I would like to say is that DomainHealth is not intended as a alternative to WLDF and has been developed specifically for certain use cases for a certain subset of clients which I have dealt with over the years (and is indeed being used by some of these clients today).&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: arial;"&gt; &lt;/p&gt;  &lt;p style="font-family: arial; font-style: italic;"&gt;Soundtrack for today: Nearly Lost You by &lt;a href="http://en.wikipedia.org/wiki/Screaming_Trees"&gt;Screaming Trees&lt;/a&gt;&lt;/p&gt;   &lt;div id="a002301more"&gt;&lt;div id="more"&gt;  &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-5362196611700755666?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/5362196611700755666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=5362196611700755666' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5362196611700755666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5362196611700755666'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2008/05/domain-health-tool-vs-wldf-for.html' title='Domain Health tool Vs WLDF for monitoring'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_fRAf2L_KiFc/SIXdTQ9hkhI/AAAAAAAAABM/Rr8-mY3hbu0/s72-c/dhnew.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-6961176708639282592</id><published>2008-03-27T14:04:00.006Z</published><updated>2010-08-08T17:16:08.639+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='DomainHealth'/><category scheme='http://www.blogger.com/atom/ns#' term='JMX'/><title type='text'>New Open Source WebLogic Monitoring tool</title><content type='html'>&lt;span style="font-style: italic;"&gt;[Originally posted on my old BEA Dev2Dev &lt;/span&gt;&lt;a style="font-style: italic;" href="http://dev2dev.bea.com/pub/au/3316"&gt;blog&lt;/a&gt;&lt;span style="font-style: italic;"&gt; on March 27, 2008]&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;p style="font-family: arial;"&gt;&lt;b&gt;DomainHealth&lt;/b&gt; is an open source server monitoring tool for BEA's WebLogic Application Server. It collects important server runtime statistics over time for all servers in a domain, archives this data into CSV files and provides a simple Web Browser based interface for viewing graphs of statistics.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;DomainHealth is designed to have a low overhead on managed servers in terms of performance and is intended to be a 'zero config' tool &lt;b&gt;*&lt;/b&gt;.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;&lt;b&gt;*&lt;/b&gt;&lt;i&gt;(Currently in certain circumstances, some minimal configuration may be required - see the FAQ document on the project's host web site)&lt;/i&gt;&lt;/p&gt;&lt;p style="font-family: arial;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_fRAf2L_KiFc/SIXbzextuvI/AAAAAAAAAA8/0IxdUXJhLwA/s1600-h/dh1.png"&gt;&lt;img style="cursor: pointer; width: 350px; height: 245px;" src="http://bp1.blogger.com/_fRAf2L_KiFc/SIXbzextuvI/AAAAAAAAAA8/0IxdUXJhLwA/s320/dh1.png" alt="" id="BLOGGER_PHOTO_ID_5225824620114721522" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;   &lt;/p&gt;  &lt;p style="font-family: arial;"&gt;The statistics that DomainHealth collects, includes Core Server properties (eg. Open Sockets), JDBC Data Source properties (eg. Average Connection Delay) and JMS Destination properties (eg. Messages Current). The Web HTML based interface that DomainHealth provides, enables an administrator to view line-graphs for specific harvested server properties. The administrator can choose the window of time to view data for, which may go back hours, days, months and even years. Alternatively, an administrators can use his/her own tool of choice (eg. MS Excel, Open Office Spreadsheet) to analyse the contents of the generated CSV files (eg. to generate a graph view of some data from the CSV file loaded into a spreadsheet).&lt;/p&gt;&lt;p style="font-family: arial;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_fRAf2L_KiFc/SIXbzvf2s3I/AAAAAAAAABE/40odBAa5WaE/s1600-h/dh2.png"&gt;&lt;img style="cursor: pointer; width: 350px; height: 260px;" src="http://bp3.blogger.com/_fRAf2L_KiFc/SIXbzvf2s3I/AAAAAAAAABE/40odBAa5WaE/s320/dh2.png" alt="" id="BLOGGER_PHOTO_ID_5225824624603214706" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="font-family: arial;"&gt;   &lt;/p&gt;&lt;p style="font-family: arial;"&gt;DomainHealth is deployed to the Admin Server of a WebLogic domain in the form of a J2EE Web-Application (WAR), and immediately collects properties from all servers in the domain, via a periodic polling mechanism, once a minute. All CSV files are generated and stored on the file-system of the Admin Server for subsequent viewing via the DomainHealth graphical web interface or for retrieval for offline analysis.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Domain Health is hosted on SourceForge at: &lt;a href="http://sourceforge.net/projects/domainhealth"&gt;http://sourceforge.net/projects/domainhealth&lt;/a&gt;&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;The latest version can be downloaded from the project home page. The home page also contains links to various Help Documents plus an Online Forum for users to get help and provide feedback. To install and run the DomainHealth monitor application, follow these simple steps:&lt;/p&gt;  &lt;ol style="font-family: arial;"&gt;&lt;li&gt;Deploy domainhealth-nn.war to WebLogic, targetted to the Admin Server server of the domain only&lt;/li&gt;&lt;li&gt;Using a Web Browser, navigate to: http://adminhost:port/domainhealth&lt;/li&gt;&lt;/ol&gt;  &lt;p style="font-family: arial;"&gt;Supports WebLogic Server 9.x and 10.x.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Some people may ask why the need for this tool given the availability of WLDF in WebLogic. Personally I think these two tools are complimentary and I intend to blog on my reasons for this opinion in the near future.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt; &lt;/p&gt;&lt;p style="font-family: arial;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-family: arial; font-style: italic;"&gt;Soundtrack for today: Auto Rock by &lt;a href="http://en.wikipedia.org/wiki/Mogwai_%28band%29"&gt;Mogwai&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/1304066656993695443-6961176708639282592?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/6961176708639282592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=6961176708639282592' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6961176708639282592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/6961176708639282592'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2008/03/new-open-source-weblogic-monitoring.html' title='New Open Source WebLogic Monitoring tool'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_fRAf2L_KiFc/SIXbzextuvI/AAAAAAAAAA8/0IxdUXJhLwA/s72-c/dh1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-4851290818388481022</id><published>2008-02-25T18:54:00.010Z</published><updated>2010-08-08T17:14:59.603+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RPC'/><category scheme='http://www.blogger.com/atom/ns#' term='Messaging'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='CRUD'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><title type='text'>Web Services: RPC, REST and Messaging</title><content type='html'>&lt;em style="font-style: italic;"&gt;[Originally posted on my old BEA Dev2Dev &lt;a href="http://dev2dev.bea.com/pub/au/3316"&gt;blog&lt;/a&gt; on &lt;/em&gt;&lt;span style="font-style: italic;"&gt;February 25, 2008&lt;/span&gt;&lt;em&gt;&lt;span style="font-style: italic;"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;/em&gt;&lt;p style="font-family: arial;"&gt;&lt;em&gt;Choosing a model for interoperable communication in the enterprise&lt;/em&gt;&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;For the implementation of Web Services in the enterprise environment, I've seen many different technologies used. Recently, in my spare moments, I've reflected on this and have come to the conclusion that all these technologies tend to fit one of three models (or hybrids of these models). &lt;/p&gt;&lt;p style="font-family: arial;"&gt;I would summarise these three models as:&lt;/p&gt;  &lt;ol style="font-family: arial;"&gt;&lt;li&gt; &lt;strong&gt;Remote Procedure Calls&lt;/strong&gt; (&lt;a href="http://en.wikipedia.org/wiki/Remote_procedure_call"&gt;RPC&lt;/a&gt;). A client-server based remotable pattern where a subset of an existing system's local functions is exposed pretty much 'as-is' over the wire to client programs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Resource-oriented Create-Read-Update-Delete&lt;/strong&gt; (&lt;a href="http://en.wikipedia.org/wiki/Create%2C_read%2C_update_and_delete"&gt;CRUD&lt;/a&gt;). A client-server based resource-oriented pattern where the server-side provides a representation of a set of resources (often hierarchical) and exposes Create, Read, Update and Delete capabilities for these resources to client programs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Messaging&lt;/strong&gt; (eg. as commonly seen with &lt;a href="http://en.wikipedia.org/wiki/Message-oriented_middleware"&gt;Message Oriented Middleware&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/B2B"&gt;B2B&lt;/a&gt;). Messages or documents are passed asynchronously between peer systems in either, but not always both, directions.&lt;/li&gt;&lt;/ol&gt;      &lt;p style="font-family: arial;"&gt;Sometimes its hard to distinguish between these models and where the boundaries lie. In fact, I don't think there are boundaries, only grey areas and all three models lie in the same spectrum. I've attempted to visualise this spectrum in the diagram below.&lt;br /&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_fRAf2L_KiFc/SIXalCjW13I/AAAAAAAAAA0/w8-NIX28CPs/s1600-h/comm_spectrum.png"&gt;&lt;img style="cursor: pointer; width: 537px; height: 230px;" src="http://bp1.blogger.com/_fRAf2L_KiFc/SIXalCjW13I/AAAAAAAAAA0/w8-NIX28CPs/s1600/comm_spectrum.png" alt="" id="BLOGGER_PHOTO_ID_5225823272508512114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Depending on where your implementation lies in the spectrum, the different highlighted characteristics should manifest themselves.  &lt;p style="font-family: arial;"&gt;In the Web Services world, we may typically implement these three models using one of the following three approaches:&lt;/p&gt;  &lt;ol style="font-family: arial;"&gt;&lt;li&gt;&lt;em&gt;Remote Procedure Calls&lt;/em&gt;: &lt;strong&gt;SOAP&lt;/strong&gt; using a synchronous RPC programming approach and, typically, generated 'skeletons/stubs' and some sort of Object-to-XML marshalling technology&lt;/li&gt;&lt;li&gt;&lt;em&gt;Resource-oriented Create-Read-Update-Delete&lt;/em&gt;: &lt;strong&gt;REST&lt;/strong&gt; or 'RESTful Web Services' or ROA, re-using World-Wide-Web based approaches and standards like HTTP and URIs&lt;/li&gt;&lt;li&gt;&lt;em&gt;Messaging&lt;/em&gt;: &lt;strong&gt;SOAP&lt;/strong&gt; using an asynchronous Message/Document passing approach where invariably the documents are defined by schemas and, often, the use of message-level (rather than transport-level) security elements is required&lt;/li&gt;&lt;/ol&gt;  &lt;p style="font-family: arial;"&gt;The confusing thing is the fact that SOAP can happily and naturally satisfy two of these three models (ie. both RPC and Messaging), albeit that these two models are polar opposites which causes much confusion and is probably part of the reason why SOAP gets a bad name in some quarters.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;The problem is further compounded with SOAP because the SOAP specification and accompanying collateral talks about two possible 'Styles' (ie. 'RPC' style and 'Document' style). However as I explained &lt;a href="http://pauldone.blogspot.com/2007/07/rpc-encoded-document-literal-does-it.html"&gt;here&lt;/a&gt;, just because your SOAP Web Services are marked as 'Document' style in your WSDLs, it doesn't mean you are not doing remote procedure call based programming.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;When faced with the REST zealot or the WS-* zealot, we probably need to bear this spectrum in mind. For the Web Services paradigm, there is not a 'one-size fits all' and specific requirements for a given situation should dictate which position in this spectrum best lends itself to satisfying the requirements. Also, the overlap between the models may be greater than shown in the diagram. For example, some would argue that REST can happily and more appropriately be used to fulfil what would otherwise be RPC oriented problems, in addition to solving Resource-oriented CRUD style problems.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family: arial; font-style: italic;"&gt;Soundtrack for today: Purity by &lt;a href="http://en.wikipedia.org/wiki/The_God_Machine_%28band%29"&gt;The God Machine&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/1304066656993695443-4851290818388481022?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/4851290818388481022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=4851290818388481022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/4851290818388481022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/4851290818388481022'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2008/02/web-services-rpc-rest-and-messaging.html' title='Web Services: RPC, REST and Messaging'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_fRAf2L_KiFc/SIXalCjW13I/AAAAAAAAAA0/w8-NIX28CPs/s72-c/comm_spectrum.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1304066656993695443.post-1328721812636356007</id><published>2007-08-10T03:06:00.006+01:00</published><updated>2010-08-08T17:14:06.977+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WS-I'/><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='JMS'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle Service Bus'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>Tips for Web Services Interoperability</title><content type='html'>&lt;p  style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;[Originally posted on my old BEA Dev2Dev &lt;/span&gt;&lt;a style="font-style: italic;" href="http://dev2dev.bea.com/pub/au/3316"&gt;blog&lt;/a&gt;&lt;span style="font-style: italic;"&gt; on August 10, 2007]&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: arial;"&gt;I try to follow some simple rules to maximise interoperability when developing Web Services using WebLogic and/or AquaLogic Service Bus (ALSB). Most of the rules are pretty obvious, but perhaps one or two are not?. In case some of these rules are useful to others, I thought I'd share them, so here they are:&lt;/p&gt;  &lt;ol style="font-family: arial;"&gt;&lt;li&gt; Use SOAP over HTTP. I've blogged &lt;a href="http://pauldone.blogspot.com/2007/03/problem-with-using-soap-over-jms-in-soa.html"&gt;here&lt;/a&gt; about why SOAP over JMS shouldn't be used if interoperability is a concern.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Conform to the &lt;a href="http://www.ws-i.org/Profiles/BasicProfile-1.1.html"&gt;WS-I Basic Profile 1.1&lt;/a&gt; by using the free WS-I Test Tool. Test the WSDL and over-the-wire SOAP requests/responses for the created Web Services, for conformity using the tool available &lt;a href="http://www.ws-i.org/deliverables/workinggroup.aspx?wg=testingtools"&gt;here&lt;/a&gt; (look for "Interoperability Testing Tools 1.1").&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Expose Web Services using the "Document-Literal-Wrapped" style with the 'dotNetStyle' flag to help WS-I conformity and to be especially Microsoft product friendly. I partly covered this in the blog &lt;a href="http://pauldone.blogspot.com/2007/07/rpc-encoded-document-literal-does-it.html"&gt;here&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use the WS-* standards judiciously. WebLogic implemented standards such as WS-Addressing, WS-Security, SAML and WS-ReliableMessaging are not necessarily implemented by other Web Services products/stacks or the specification version supported by these may be different.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don't necessarily dismiss the use of WebLogic 'add-value' / 'non-standard' Web Services features at face-value    &lt;ul&gt;&lt;br /&gt;&lt;li&gt;'&lt;a href="http://edocs.bea.com/wls/docs100/webserv_adv/buffered.html"&gt;Buffered&lt;/a&gt;' Web Services are interoperable with other client Web Services stacks at the basic SOAP-HTTP level because the service consumer is not aware that the service implementation uses a JMS queue for buffering internally.&lt;/li&gt;&lt;li&gt;'&lt;a href="http://edocs.bea.com/wls/docs100/webserv_adv/callback.html"&gt;Callbacks&lt;/a&gt;' may be interoperable with non-WebLogic service &lt;u&gt;consumers&lt;/u&gt; as long as the non-WebLogic consumers include the WS-Addressing 'Reply-To' header in the request and provide a web service endpoint to be asynchronously called back on for the specified 'Reply-To' URL &lt;/li&gt;&lt;li&gt;'&lt;a href="http://edocs.bea.com/wls/docs100/webserv_adv/asynch.html"&gt;Asynchronous Requests/Responses&lt;/a&gt;' may be interoperable with non-WebLogic service &lt;u&gt;providers&lt;/u&gt; as long as the non-WebLogic providers honour the received WS-Addressing 'Reply-To' header of the request, by sending the Web Service response asynchronously to the specified 'Reply-To' URL.&lt;/li&gt;&lt;li&gt;However, '&lt;a href="http://edocs.bea.com/wls/docs100/webserv_adv/conversation.html"&gt;Conversational&lt;/a&gt;' Web Services are highly unlikely to be interoperable with non-WebLogic based service providers or consumers. The specification 'WS-Conversation' which the 'Conversational' feature would probably most clearly map to, doesn't really exist as a public specification and there is no indication that it ever will (an incomplete internal draft version has been dormant for a few years now).&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;For SOAP/HTTP Proxies created in ALSB, activate the "WS-I compliance enforcement" option (for the development phase of the project at least). When ALSB is used to act as an intermediary between Web Services consumers and providers, this ALSB option will help any Web Service non-conformities to be detected, so that they can be quickly rectified.&lt;/li&gt;&lt;/ol&gt;  &lt;p style="font-family: arial;"&gt;Note: ALSB also transparently converts between SOAP version 1.1 and SOAP version 1.2 inbound and outbound messages and ALSB is specifically tested by BEA for interoperability against third-party vendor toolkits such as Microsoft .NET and Apache Axis.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family: arial; font-style: italic;"&gt;Soundtrack for today: Forensic Scene by &lt;a href="http://en.wikipedia.org/wiki/Fugazi"&gt;Fugazi&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/1304066656993695443-1328721812636356007?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/1328721812636356007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=1328721812636356007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1328721812636356007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1328721812636356007'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2007/08/tips-for-web-services-interoperability.html' title='Tips for Web Services Interoperability'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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-1304066656993695443.post-1749274950818208059</id><published>2007-07-31T14:10:00.008+01:00</published><updated>2010-08-08T17:13:18.139+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='Wrapped'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='JAX-WS'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Document-Literal'/><category scheme='http://www.blogger.com/atom/ns#' term='JAX-RPC'/><category scheme='http://www.blogger.com/atom/ns#' term='RPC-Encoded'/><title type='text'>RPC-Encoded. Document-Literal. Does it really matter?</title><content type='html'>&lt;p  style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;[Originally posted on my old BEA Dev2Dev &lt;/span&gt;&lt;a style="font-style: italic;" href="http://dev2dev.bea.com/pub/au/3316"&gt;blog&lt;/a&gt;&lt;span style="font-style: italic;"&gt; on  July 31, 2007&lt;/span&gt;]&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: arial;"&gt;In SOAP, there are two possible &lt;em&gt;styles&lt;/em&gt;:&lt;/p&gt; &lt;ol style="font-family: arial;"&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;RPC&lt;/em&gt;&lt;/strong&gt;. Implies a SOAP body structure which indicates service name, and multiple parameters and return values&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Document&lt;/em&gt;&lt;/strong&gt;. Implies a SOAP body which is a complex message document&lt;/li&gt;&lt;/ol&gt;  &lt;p style="font-family: arial;"&gt;In SOAP, there are two possible &lt;em&gt;uses&lt;/em&gt;:&lt;/p&gt; &lt;ol style="font-family: arial;"&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Encoded&lt;/em&gt;&lt;/strong&gt;. Adheres to a set of rules for serialising a graph of typed objects using basic XML schema data-types, but as a whole, does not conform to a schema&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Literal&lt;/em&gt;&lt;/strong&gt;. Body content conforms to a specific XML schema&lt;/li&gt;&lt;/ol&gt;  &lt;p style="font-family: arial;"&gt;In most SOAP toolkits, the most common combinations of Style and Use are &lt;strong&gt;RPC-Encoded&lt;/strong&gt; and &lt;strong&gt;Document-Literal&lt;/strong&gt;. Additionally, &lt;strong&gt;RPC-Literal&lt;/strong&gt; is becoming more prevalent although it is currently a lot less common. &lt;strong&gt;Document-Encoded&lt;/strong&gt; doesn't really make sense and as a result I doubt you'll find it implemented in your favourite SOAP toolkit.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;RPC-Encoded was the initial message format for SOAP, when SOAP was originally aimed at just the Remote Procedure Call programming model. Document-Literal was incorporated into the SOAP standard in time for SOAP 1.0. It was intended to enable XML documents (messages) to be passed as the full content of the SOAP body, usually with one input message part and one return message part.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Like most J2EE Application Servers, the core of WebLogic's Web Services support is based on the &lt;em&gt;JAX-RPC 1.1&lt;/em&gt; specification. JAX-RPC defines a Remote Procedure Call based programming model and API for developers who want to expose a set of Java methods remotely (JAX-RPC does not offer much in the way of support for adopting the alternative distributed computing model of "Messaging").&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Given that JAX-RPC is based on the RPC programming model, then in terms of best practices, it's obvious then that we should be using RPC-Encoded (or RPC-Literal) as the preferred SOAP Style/Use for creating and exposing newly developed Web Services, isn't it?&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Well, not necessarily....&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;The terminology of RPC versus Document SOAP Styles is very unfortunate when we start to consider &lt;strong&gt;Remote Procedure Call&lt;/strong&gt; versus &lt;strong&gt;Document/Messaging&lt;/strong&gt; distributed programming models. These terms imply that the RPC Style should be used for RPC programming models and that the Document style should be used for Document (Messaging) programming models. That is not the case at all. In practice, the SOAP Style has nothing to do with a programming model, it merely dictates how to translate a WSDL binding to a SOAP message. For example, WebLogic's JAX-RPC toolkit equally supports exposing the same Java methods remotely via either style. You can use either style with either programming model.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;A SOAP Style/Use of &lt;strong&gt;Document-Literal&lt;/strong&gt; provides &lt;strong&gt;two&lt;/strong&gt; distinct advantages over RPC-Encoded:&lt;/p&gt; &lt;ol style="font-family: arial;"&gt;&lt;li&gt;&lt;a href="http://www.ws-i.org/Profiles/BasicProfile-1.0-2004-04-16.html"&gt;WS-I Basic Profile&lt;/a&gt; precludes the use of "Encoded" as the SOAP Use. So, if promoting interoperability and openness is your concern then you wouldn't choose RPC-Encoded over Document-Literal&lt;strong&gt;*&lt;/strong&gt; (and why else would you be using SOAP other than for interoperability?).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;RPC-Encoded provides no real separation between the format of the SOAP body (eg. that could be defined by a Schema) and the transport protocol and invocation format of a SOAP operation (eg. defined by a WSDL). For Document-Literal, the SOAP body content conforms to one or more Schemas which can optionally be externalised from the WSDL (and then included into the WSDL via an 'import' statement). Why is this important? Well, Document-Literal can promote the &lt;strong&gt;re-use&lt;/strong&gt; of the same XML Schemas across the many different Web Services you may need to expose and throughout the rest of your distributed application logic which may need to deal with the same XML data formats. As we know, re-use reduces development effort, helps avoid errors and promotes consistency.&lt;/li&gt;&lt;/ol&gt; &lt;p style="font-family: arial;"&gt;In summary, the decision of using RPC-Encoded or Document-Literal really doesn't have a direct relation to whether one is adopting a Remote Procedure Call programming model rather than a Document/Message-passing programming model. In practice, regardless of programming model, Document-Literal offers practical advantages.&lt;/p&gt;&lt;p style="font-family: arial;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Footnote&lt;/strong&gt;: There is a new alternative Web Services toolkit which can be used, based on JAX-WS 2.0. JAX-WS offers developers an alternative programming model based on Messaging in addition to the Remote Procedure Programming model which is also supported. JAX-WS is newly supported in WebLogic 10, with some &lt;a href="http://edocs.bea.com/wls/docs100/webserv/jaxws.html#wp225426"&gt;restrictions&lt;/a&gt;.&lt;p style="font-family: arial;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-family: arial;"&gt;&lt;small&gt;&lt;strong&gt;*&lt;/strong&gt; In fact, use WebLogic's 'Wrapped' option with "Document-Literal" to help further promote interoperability with both Microsoft based Web Services toolkits (which traditionally prefer the Document-Literal-Wrapped style) and Remote Procedure Call oriented client Web Services toolkits (which often expect to be able to include the 'remote operation' name within the SOAP requests they send, rather than using another mechanism such as WS-Addressing to identify the operation to invoke).&lt;/small&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="font-family: arial; font-style: italic;"&gt;Soundtrack for today: Off To One Side by &lt;a href="http://en.wikipedia.org/wiki/Come_%28US_band%29"&gt;Come&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/1304066656993695443-1749274950818208059?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/1749274950818208059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=1749274950818208059' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1749274950818208059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/1749274950818208059'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2007/07/rpc-encoded-document-literal-does-it.html' title='RPC-Encoded. Document-Literal. Does it really matter?'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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-1304066656993695443.post-5943847216042586159</id><published>2007-07-24T13:56:00.008+01:00</published><updated>2010-08-08T17:12:34.562+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='rlwrap'/><category scheme='http://www.blogger.com/atom/ns#' term='Readline'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='WLST'/><category scheme='http://www.blogger.com/atom/ns#' term='SQLPlus'/><title type='text'>WLST and SQLPLus on Linux - get UP, DOWN, LEFT, RIGHT and other keys working</title><content type='html'>&lt;p  style="font-style: italic;font-family:arial;"&gt;[Originally posted on my old BEA Dev2Dev &lt;a href="http://dev2dev.bea.com/pub/au/3316"&gt;blog&lt;/a&gt; on July 24, 2007]&lt;/p&gt;&lt;p face="arial"&gt;This has been bugging me for ages so today I spent some time trying to find a solution. I've managed to find one, so I thought I'd share it with you just in case it is useful to others....&lt;/p&gt;  &lt;p face="arial"&gt;When running command line tools in a Linux shell that read from standard input (using the 'readline' library under the covers), the &lt;strong&gt;UP&lt;/strong&gt; and &lt;strong&gt;DOWN&lt;/strong&gt; arrow keys can't be used to select previous history commands. Also,  the &lt;strong&gt;LEFT,&lt;/strong&gt; &lt;strong&gt;RIGHT&lt;/strong&gt; arrow keys and the &lt;strong&gt;HOME&lt;/strong&gt; and &lt;strong&gt;END&lt;/strong&gt; keys can't be used to move to different parts of the current text line to easily correct mistakes in the line before submitting.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;As a JavaEE/WebLogic user I find this really frustrating when I need to use tools like WLST or SQLPlus in interactive mode to mess around with WebLogic domains or change Oracle database schemas, respectively. Well the solution is a nifty little tool called &lt;strong&gt;rlfe&lt;/strong&gt; which I found &lt;a href="http://per.bothner.com/software/"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Once installed, before running 'wlst.sh' or 'sqlplus' from a shell, first enter...&lt;/p&gt;  &lt;p style="font-family: arial;"&gt; &gt; &lt;strong&gt;rlfe&lt;/strong&gt;&lt;/p&gt;  &lt;p style="font-family: arial;"&gt; ...and press return. Then when you run WLST or SQLPlus from the same shell, the interactive mode will work the way you always wanted it to. You'll be able to press the UP key to get to a previous command to execute it and you'll be able to press the LEFT key to move further back in the line of text to correct a typo.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;The good news if you're a Ubuntu user is that this is available in the standard universe repository. To install it, just run....&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;&lt;strong&gt; &gt; sudo apt-get install rlfe&lt;/strong&gt;&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Also, to avoid forgetting to run 'rlfe' before running your program, you can use an alias for the program to ensure that your program is always run in this 'enhanced' text entry mode. For example, add the following to ~/.bashrc :&lt;/p&gt;  &lt;p style="font-family: arial;"&gt; &lt;strong&gt;alias sqlplus='rlfe sqlplus'&lt;/strong&gt;&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;..then whenever you run sqlplus from the command line it'll work the w&lt;span style="font-style: italic;"&gt;ay you want.&lt;/span&gt;&lt;/p&gt;    &lt;p style="font-style: italic; font-family: arial;"&gt;[In a comment on the original Dev2Dev blog '&lt;span class="ltcaption1"&gt;eduardo_biagi' suggested an alternative tool called '&lt;span style="font-weight: bold;"&gt;rlwrap&lt;/span&gt;' which works on Fedora. Since installing 8.04 version of Ubuntu, 'rlfe' does not work properly on Ubuntu so I now use &lt;/span&gt;&lt;span class="ltcaption1"&gt;'rlwrap'. For example I have the following alias set up in my .bashrc: '&lt;span style="font-weight: bold;"&gt;alias wlst='rlwrap /opt/oracle/wls1001/wlserver_10.0/common/bin/wlst.sh&lt;/span&gt;']&lt;/span&gt;&lt;/p&gt;&lt;p face="arial" style="font-style: italic;"&gt;&lt;span class="ltcaption1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: arial; font-style: italic;"&gt;Soundtrack for today: Faded by &lt;a href="http://en.wikipedia.org/wiki/The_Afghan_Whigs"&gt;The Afghan Whigs&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/1304066656993695443-5943847216042586159?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/5943847216042586159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=5943847216042586159' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5943847216042586159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/5943847216042586159'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2007/07/wlst-and-sqlplus-on-linux-get-up-down.html' title='WLST and SQLPLus on Linux - get UP, DOWN, LEFT, RIGHT and other keys working'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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-1304066656993695443.post-724016020512041252</id><published>2007-03-28T16:44:00.009+01:00</published><updated>2010-08-08T17:12:08.628+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='JMS'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='OSI'/><category scheme='http://www.blogger.com/atom/ns#' term='Interoperability'/><title type='text'>The problem with using SOAP over JMS in SOA</title><content type='html'>&lt;p  style="font-family:arial;"&gt;&lt;span style="font-style: italic;"&gt;[Originally posted on my old BEA Dev2Dev &lt;/span&gt;&lt;a style="font-style: italic;" href="http://dev2dev.bea.com/pub/au/3316"&gt;blog&lt;/a&gt;&lt;span style="font-style: italic;"&gt; on March 28, 2007]&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: arial;"&gt;Sometimes I talk to people who seem to view the use of SOAP over JMS as the perfect combination to enable loosely coupled asynchronous shared services. However, when I dig deeper these people have invariably assumed that JMS is an 'over-the-wire' protocol, like HTTP. It is not.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;&lt;strong&gt;Question:&lt;/strong&gt; Why is this a problem?&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Interoperability, plain and simple.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;HTTP is a standard 'over-the-wire' protocol. HTTP belongs in the Application Layer of both the &lt;a href="http://en.wikipedia.org/wiki/OSI_model"&gt;OSI model&lt;/a&gt; (layer 7) and the &lt;a href="http://en.wikipedia.org/wiki/TCP/IP"&gt;Internet Protocol Suite&lt;/a&gt; (layer 4 or 5). SOAP is a 'standard' (or &lt;a href="http://www.w3.org/TR/soap/"&gt;W3C&lt;/a&gt; recommendation at least) transport agnostic protocol which uses an XML payload.   &lt;/p&gt;&lt;p style="font-family: arial;"&gt;Due to the standard and technology agnostic nature of both SOAP and HTTP, many platforms and toolkits out there, written in different languages and on different operating systems, can interoperate using SOAP over HTTP by simply adhering to both of these standards (or at least the &lt;a href="http://www.ws-i.org/"&gt;WS-I&lt;/a&gt; version of these standards).&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;However, &lt;a href="http://en.wikipedia.org/wiki/Java_Message_Service"&gt;JMS&lt;/a&gt; is not an 'over-the-wire' protocol. It is a Java API which requires that a client application uses a JMS provider library (JAR) provided by the vendor of the JMS Server hosting the services. This is analogous to requiring a JDBC driver for a particular vendor's database before a Java application can talk to that database. The actual 'over-the-wire' protocol used under the covers within the JMS provider library is not defined (it could be IIOP for example, or it could be some high speed non-standard vendor specific protocol).&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;As a result, in most cases, the only types of applications which can talk to a specific vendor's JMS Server are other Java based applications. It gets worse. If, for example, the JMS server vendor is IBM WebSphere and the service consumer is running within Oracle's Application Server, there may be problems even getting IBM's JMS client provider library working from within Oracle's Application Server in the first place, due to JMS implementation clashes. Some JMS Server vendors provide one or two non-Java based JMS libraries too (for example for C++ or .NET), but these are often limited in functionality and scope and often only support specific versions of specific platforms and operating systems.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;In other words, the onus of interoperability, when using SOAP over JMS, is on the support of the vendor of the JMS server for all possible service consumer environments rather than the onus being on the service client's host environment support for standards. Vendors cannot scale to provide JMS support for all of the wide mix of programming languages, application servers and operating systems (including different versions) out there, so interoperability will take a big hit. Even for consumer applications that can use the JMS provider, one has to give the service consumer the provider library first before it can invoke services - not very loosely coupled I think.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;As a result, an enterprise's design choice to use SOAP over JMS, as the default mechanism for interoperability for an enterprise's mix of heterogeneous systems, is likely to be fundamentally flawed in my opinion.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;It is important to state that I am not saying that Message Oriented Middleware (MOM) does not have a place in a SOA framework. In fact, quite the opposite is true. To achieve capabilities such as asynchronous messaging, guaranteed delivery, only once delivery, and publish/subscribe mechanisms, MOMs are an essential part of the SOA fabric. That's why many vendor's ESB platforms are built on the underlying technology of Message Oriented Middleware. However, what I am saying is that JMS should not be the preferred API for exposing shared services to remote service clients. Using middleware such as an ESB for example, a service with an asynchronous interface can be exposed via a SOAP over HTTP interface, for example, where the ESB performs the switching between the consumer facing synchronous invocation protocol and the underlying internal asynchronous message passing mechanism which may or may not use JMS internally.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;With the right organisation and governance in place, I believe it can be valid to decide to expose a shared service via SOAP/JMS in addition to SOAP/HTTP or another more 'open' protocol, where there are valid exceptional circumstances (eg. high performance requirements). However, it is probably best to treat these decisions on an exception by exception basis because the overhead of supporting two access methods for a service does have an additional overhead due to increased configuration, maintenance, and testing costs.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Is HTTP the perfect transport for SOAP, especially for asynchronous services? Not at all. However, if consumers can't invoke these services in the first place - that's worse.&lt;/p&gt;  &lt;p style="font-family: arial;"&gt;Have I got something against JMS? Not at all. Its one of my favourite JavaEE APIs. I'm not talking about JavaEE here. I am talking about SOA.&lt;/p&gt;&lt;br /&gt;&lt;p style="font-family: arial;"&gt;&lt;em&gt;Soundtrack for today: Happy Man by &lt;a href="http://en.wikipedia.org/wiki/Sparklehorse"&gt;Sparklehorse&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1304066656993695443-724016020512041252?l=pauldone.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pauldone.blogspot.com/feeds/724016020512041252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1304066656993695443&amp;postID=724016020512041252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/724016020512041252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1304066656993695443/posts/default/724016020512041252'/><link rel='alternate' type='text/html' href='http://pauldone.blogspot.com/2007/03/problem-with-using-soap-over-jms-in-soa.html' title='The problem with using SOAP over JMS in SOA'/><author><name>Paul Done</name><uri>http://www.blogger.com/profile/09556312012162376804</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>
