<?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-5862547309732289650</id><updated>2011-11-17T12:06:12.887-08:00</updated><category term='iona progress merger acquisition reykjavik cxf apache'/><category term='servicemix osgi oracle jdbc pool'/><category term='open source unique selling point professional services'/><category term='tssjs java dsl'/><category term='servicemix osgi postgresql jdbc pool'/><category term='ServiceMix CXF FUSE SOA registry repository'/><category term='CXF FUSE code-first'/><title type='text'>Ade On Middleware</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-929315038210651824</id><published>2010-09-13T10:43:00.000-07:00</published><updated>2010-09-13T10:46:57.759-07:00</updated><title type='text'>FUSE Community Day Paris 2010</title><content type='html'>I'll be at the &lt;a href="http://form.fusesource.com/forms/registerparis2010"&gt;FUSE Community Day, Paris&lt;/a&gt; event on October 14th! Feel free to sign up and come along - If the London event in June is anything to by I know it's going to be a great day out :) We've got some great speakers lined up (including all of our &lt;a href="fusesource.com"&gt;FUSE&lt;/a&gt; rock stars like Claus Ibsen, Rob Davies, and James Strachan. &lt;br /&gt;&lt;br /&gt;Rockin'!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-929315038210651824?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/929315038210651824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=929315038210651824' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/929315038210651824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/929315038210651824'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/09/fuse-community-day-paris-2010.html' title='FUSE Community Day Paris 2010'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-79765124259332531</id><published>2010-09-08T01:09:00.000-07:00</published><updated>2010-09-08T02:08:15.442-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ServiceMix CXF FUSE SOA registry repository'/><title type='text'>Survival of the fittest: the evolution of the SOA registry / repository concept</title><content type='html'>I've decided to write a little about SOA registries and repositories, as a few customers have brought up these issues recently and I wanted to clear the air (and, in some sense, clear my own head too). I dragged in some sanity checks from my fellow consultants at &lt;a href="fusesource.com"&gt;FUSE&lt;/a&gt; just to get their feeling on the adoption of SOA registry tooling, so hopefully what follows will make some sense.&lt;br /&gt;&lt;br /&gt;There was a flurry of activity some years ago (say, around 2007/2008) about SOA (Service-Oriented Architecture) Registries and Repositories. SOA evangelists, architects and "thinkers' waxed lyrical about how real SOA experts (with capital letters) used registries and repositories, and that the 'little-SOA' folk just didn't get the concept, god bless them. Vendors rushed to provide (sometimes expensive) SOA registry / repository tools, a move probably motivated more from the realization that underlying SOA infrastructure and middleware was becoming a commodity, rather than the fact that customers really did need a registry.&lt;br /&gt;&lt;br /&gt;Funny that.&lt;br /&gt;&lt;br /&gt;Because in many of the SOA customers I've worked with, they simply haven't needed a repository/registry. In fact, the mandate from on top to get a SOA registry or repository has been a distraction! Now, don't get me wrong: I'm not saying the SOA registries are a bad idea. Not at all. I'm just saying that, as a tool, they solve a particular problem. And, if you don't have that problem, then you don't need the tool. &lt;br /&gt;&lt;br /&gt;Let's consider what a SOA registry / repository might do for you.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Store contracts, service level agreements, code, deployable artifacts, documentation (this is the 'repository' nature of the tool)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Act as a run-time lookup for physical location of services - thus abstracting a services physical network address from a 'logical' network address. (this is the 'registry' nature of the tool)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Keep a track of who is using what services, and how much (this is the 'governance' nature).&lt;/li&gt;&lt;li&gt;Enforce service level agreements (again, this is more governance: making sure that the services are available and doing what they should do in a timely fashion)&lt;/li&gt;&lt;/ol&gt;Interestingly, I've found that the 'repository' problem is often solved using readily available file-sharing tools, HTTP servers, or even source-code management tools like SVN, GIT or CVS. Not glittery, sexy, 'made-to-measure' SOA repositories, but pragmatic, workable and relatively simple. One customer I know took a pragmatic approach which I really admire: "We're going to use a Wiki for our first set of services. When our Wiki becomes a pain, then we'll look at getting something more appropriate. But not until then."&lt;br /&gt;&lt;br /&gt;The 'registry' problem is sometimes solved in software: for example, the &lt;a href="http://web.progress.com/en/sonic/artix-index.html"&gt;Artix Locator&lt;/a&gt;, integrated with &lt;a href="fusesource.com"&gt;Apache CXF&lt;/a&gt;, allows services to register themselves automatically with a well-known-registry, which clients can then look up at runtime. Nice! I've seen other CXF users write their own registries to achieve something similar - it's really not rocket science (although, you can make your registry as complicated as you like!). I would like to see an open-source implementation of such a runtime-registry, perhaps making use of recent innovative projects like Apache Zookeeper to keep track of who's up and who's down. As an additional note on registries: one customer noted that the OSGi registry,  particular in the context of distributed OSGi (dOSGi), adds another  dimension to the idea of dynamic, transparent lookup of services. And, if you're acting smart in a JBI or ServiceMix 4 world, you can achieve location transparency through the NMR or ActiveMQ POQs (plain-old-queues).&lt;br /&gt;&lt;br /&gt;Interestingly though, if you have your network folk in the room, they'll argue that they can solve this whole lookup and  'location transparency' problem in a heart-beat in hardware with a network switch: think about it: I can go to www.google.com every day - in fact, so can my mam - and never worry about what machine my search gets directed too. So, often people can achieve the 'registry' functionality easy, sometimes with zero code.&lt;br /&gt;&lt;br /&gt;So, while there is certainly some argument for using registries and repositories for storage and retrieval of information about what services you have on the network, there are often many options available to you that don't need a dedicated software tool. And, keep in mind, if you have only a small number of services - say up to 20 - you really don't have a management problem - so ad hoc approaches like Wiki's may be perfectly adequate.&lt;br /&gt;&lt;br /&gt;With this in mind, I think that 'SOA registry-repository' offerings begin to offer value when they tackle SOA Governance issues, and I think this is the evolutionary route these products are taking. IT owners want to know that security policies are being enforces - these policies should be configurable, not 'designed into' the fabric and code of a service where they're difficult to change. They want to know if the response times are being sluggish. They want a record of who accessed what, and when. This could be for a legal audit trail, but is probably more useful internally as a 'proof-point' to show that service re-use is happening, and, more importantly, a way for a core SOA Centre of Competence to demonstrate the value that its services are offering the rest of the organization. Now this, for me, is a place where these tools can offer real value. As a Progress employee I am biased, and will of course recommend Actional which does an awesome job in this regard - but, as a fair and open-minded person, I have seen users of CXF propose to use HP SOA Centre to achieve something architecturally similar. Actional acts as a 'gateway'. You register your services with it (hey, a touch of 'registry!'). You apply your security policies. And away you go:  all SOA requests get passed through gateway and SLAs are enforced and reported. Governance made easy. The only problem with this architecture, from my perspective, is that it creates a potential 'gateway bottleneck; however, with appropriate load-balancing in place this hasn't yet been a problem in practice.&lt;br /&gt;&lt;br /&gt;At the end of the day, the tooling is evolving to the point of value around the concepts of governance - I welcome this. However, I still believe that if you're embarking on creation or adoption of SOA concepts, you shouldn't get stalled in the early stages by selection of SOA registry / repository. First, understand your needs - your &lt;em&gt;real&lt;/em&gt; needs - in this area, and then, go look for right tool for the job.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-79765124259332531?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/79765124259332531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=79765124259332531' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/79765124259332531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/79765124259332531'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/09/survival-of-fittest-evolution-of-soa.html' title='Survival of the fittest: the evolution of the SOA registry / repository concept'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-2977181996955115284</id><published>2010-09-08T00:53:00.000-07:00</published><updated>2010-09-08T01:01:35.389-07:00</updated><title type='text'>Versioning WSDL interfaces in an OSGi world</title><content type='html'>Some time ago (2007, I think) I wrote a short paper with Oliver Wulff on WSDL versioning. Recently, I shared this paper with some smart OSGi-savvy ServiceMix users, and it raised a discussion about how does WSDL interface versioning mix with the versioning concepts in OSGi? Below is an extract of an email response I sent back to them: for me, the bottom line is that WSDL interface versioning (in fact, any interface versioning) is a separate concern to the way we version implementations.&lt;br /&gt;&lt;br /&gt;For anyone out there who is implementing Web Services using OSGi runtimes like &lt;a href="http://fusesource.com/"&gt;FUSE ESB&lt;/a&gt; (built on &lt;a href="http://servicemix.apache.org/"&gt;Apache ServiceMix&lt;/a&gt; and &lt;a href="http://karaf.apache.org/"&gt;Apache Karaf&lt;/a&gt;), you might find the thoughts below of interest.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;From my side, I think the most important point is that my paper concerns WSDL versioning, that is, the versioning of an *interface*; the versioning of an OSGi bundle is, from a service consumer's perspective, an *implementation* detail and a totally separate concern. I believe you should consider the versioning of the interface and the implementation as two *separate* evolutionary paths.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-family: courier new;"&gt;So, I could have, say, version 1 of an 'foo' web service, in namespace http://www.myorg.com/services/foo/v1, defined in foo-v1.0.wsdl. We might generate the Java JAX-WS/JAXB-B classes, and then package as a bundle foo-ws-api-1.0.jar. I could implement it today in bundle foo-v1.0-impl-1.0.0.jar, and then fix a bug later in foo-v1.0-impl-1.0.1.jar, add a cool new feature in foo-v1.0-impl-1.1.0.jar, and then do a completely new, high-performance implementation in foo-v1.0-impl-2.0.0.jar. All of these implementation bundles would implement *the same* version of the WSDL!!&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Now, imagine we need to do a minor change to the web service interface: say add a new operation, or add a new parameter to a method. We can do this *without* breaking on the wire interoperability by creating the new PortType in foo-v1.1.wsdl, but still in the namespace http://www.myorg.com/services/foo/v1. We would deploy the JAX-WS content for this in foo-ws-api-1.1.jar. We could do a new implementation, and put the implementation of this in foo-v1.0-impl-1.0.0.jar. Now, we can deploy the new version of both the interface and the implementation, and, if we've been careful, the new deployment will handle requests existing consumers of version 1.0 of the interface. KEEP IN MIND THAT WHILE THIS IS POSSIBLE TO DO ... (sorry for shouting!) it's actually quite tricky to understand and I think that the complexity overweighs the benefits for most users. So, it's probably better to try to keep WSDL interface's versioning at major release numbers.&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Now, with this in mind, we can consider what happens when we deploy a whole new version of the WSDL interface! We can deliver foo-v2.0.wsdL, with portTypes and all in namespace http://www.myorg.com/services/foo/v2. We can deploy this API as bundle foo-ws-api-2.0.jar, and deliver our first implementation bundle as foo-v2.0-impl-1.0.0.jar. And, later, when we fix some bugs or add some features, we can deploy the new implementation as foo-v2.0-impl-1.0.1.jar.&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Get the picture? For me, the rate of change of an interface should be different to that of an implementation - ideally, it should be significantly slower, changing maybe on a yearly base. We need to apply different versioning semantics, and evolve them at different rates to the implementation bundles.&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Hope that helps!&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Best,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Ade.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-2977181996955115284?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/2977181996955115284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=2977181996955115284' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2977181996955115284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2977181996955115284'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/09/versioning-wsdl-interfaces-in-osgi.html' title='Versioning WSDL interfaces in an OSGi world'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-7375777393460002899</id><published>2010-08-25T10:46:00.000-07:00</published><updated>2010-08-25T10:47:21.386-07:00</updated><title type='text'>Karaf's Fabulous Features, and, what you can do to make them even more fabulous</title><content type='html'>I've been working for sometime with the &lt;a href="http://karaf.apache.org"&gt;Karaf&lt;/a&gt; OSGi Shell, through my exposure to the great &lt;a href="http://servicemix.apache.org"&gt;ServiceMix 4&lt;/a&gt;. The &lt;em&gt;features&lt;/em&gt; mechanism provided by Karaf/ServiceMix allows you to leverage the modularity and control of OSGi bundles by grouping sets of bundles  - containing your Camel routes, web services, business logic, RESTful services - into easily manageable 'features'. In this post, I'm going to talk a little about what features are, why they're good, and what we could do in Karaf to make their usage even easier. If you like the proposals, please, follow the JIRA links and vote for them so that we can get the community behind it. These enhancements are small, but, based on my experience, they could have a big impact on ease-of-use and adoption of a very powerful deployment mechanism.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Features: a group of bundles by any other name would sell as sweet.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A feature is just a set of bundles, described using a very simple XML file - this file is called a 'feature descriptor', and is also referred to as a 'feature repository'. Here's an example that describes a single feature, 'feature-b', that depends on another feature 'feature-a', which is itself described in another repository. I've thrown in some default configuration as well that will be synched into the OSGi Config Admin service; don't worry about this for now, I'm just showing off. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;features name="feature-b-0.0.1"&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;repository&amp;gt;mvn:com.fusesource/common-features/0.0.1/xml/features&amp;lt;/repository&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;feature name=&amp;quot;feature-b&amp;quot; version="0.0.1&amp;gt;&lt;br /&gt;  &amp;lt;feature version=&amp;quot;0.0.1&amp;quot;&amp;gt;feature-a&amp;lt;/feature&amp;gt;&lt;br /&gt;  &amp;lt;bundle&amp;gt;mvn:com.fusesource/bundle-b/0.0.1&amp;lt;/bundle&amp;gt;&lt;br /&gt;  &amp;lt;config name=&amp;quot;feature-b&amp;quot;&amp;gt;&lt;br /&gt;   a=1&lt;br /&gt;   b=2&lt;br /&gt;  &amp;lt;/config&amp;gt;&lt;br /&gt;    &amp;lt;/feature&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;lt;/features&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Features can have sensible names, like 'InsuranceQuoteService' or 'CustomerUpdatesFlow', and they can be versioned so that you can track their evolution and upgrade or rollback with ease. Features can 'depend on' other features, which means that when you install a feature, it and all of its dependent features get installed too. This is very neat: how many times have you realized that, yet again, all your SOA, RESTful services and integration flows all rely on the same common backend code? You can describe these dependencies easily and elegantly using Karaf features. And, there's a set of tools that allow you to suck down all of your feature dependencies from Maven servers onto a local drive in an elegant directory structure - automatically, as part of your build - so that you can tar.gz or .zip it all and and deliver your feature into the production environment. This last point is so important: these techniques allow you to use all of your Maven-style bundle URIs on production machines that don't have Maven installed and don't have access to the external Internet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Making features really, really easy to use&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;While all of this goodness is there for the taking in Karaf, there are a number of small improvements that, I think, will go a big way to ease the adoption of the features mechanism. My own usage of 'features' is based on what I've learnt and observed from the Karaf source itself: I want to make it easier for other developers to create, package and deploy features. And so, I've created today a number of issues on the Karaf JIRA to get the ball rolling. &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://issues.apache.org/jira/browse/KARAF-165"&gt;KARAF-165&lt;/a&gt;: Create an improved Maven feature-assembly plugin. Right now, to make a feature I've got to add almost a hundred lines of Maven verbage to my pom.xml in order to assemble a feature. I've got to use the attach-artifact goal of the org.codehaus.mojo/build-helper-maven-plugin to deploy my features file into Maven. I've got to use the add-features-to-repo goal from the org.apache.karaf.tooling/features-maven-plugin to suck down all the dependent bundles. I've got to a whole load of other stuff to perform the packaging to .tar.gz and .zip. The problem here is that I'm using a whole load of generic plugins to do a very specific job, and I'm having to tell the plugins what to do instead of telling them what I want done. I'd prefer to have a single more declarative plugin to do this. It might look like this:  &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;org.apache.karaf.tooling&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;feature-assembly-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;2.2.0&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;executions&amp;gt;&lt;br /&gt;  &amp;lt;execution&amp;gt;&lt;br /&gt;   &amp;lt;id&amp;gt;create-repo&amp;lt;/id&amp;gt;&lt;br /&gt;   &amp;lt;phase&amp;gt;generate-resources&amp;lt;/phase&amp;gt;&lt;br /&gt;   &amp;lt;goals&amp;gt;&lt;br /&gt;    &amp;lt;goal&amp;gt;create-repo&amp;lt;/goal&amp;gt;&lt;br /&gt;   &amp;lt;/goals&amp;gt;&lt;br /&gt;   &amp;lt;configuration&amp;gt;&lt;br /&gt;    &amp;lt;!-- Specify the feature file to use. --&amp;gt;&lt;br /&gt;    &amp;lt;featureFile&amp;gt;file:${basedir}/target/classes/features.xml&amp;lt;/featureFile&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!-- Specify what features to include. This is actually optional: if no features&lt;br /&gt;     are specified, then include all features in the file by default. --&amp;gt; &lt;br /&gt;    &amp;lt;features&amp;gt;&lt;br /&gt;     &amp;lt;feature&amp;gt;feature-a&amp;lt;/feature&amp;gt;&lt;br /&gt;    &amp;lt;/features&amp;gt;&lt;br /&gt;   &amp;lt;/configuration&amp;gt;&lt;br /&gt;  &amp;lt;/execution&amp;gt;&lt;br /&gt; &amp;lt;/executions&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The plugin should produce a .tar.gz and .zip file, containing the feature descriptor (and all dependent descriptors) and all bundles (and dependent bundles)in a Maven-style directory, similar to the system/ directory currently used in Karaf. Note that this plugin doesn't need you to list out all the feature repositories / descriptors that your feature file may transitively include - it will detect these dependencies at runtime and work out the details.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://issues.apache.org/jira/browse/KARAF-151"&gt;KARAF-151&lt;/a&gt;: We need to add a hot-deploy mechanism, that will detect feature assemblies dropped in the deploy/ directory, and unarchive the file into, say, a contrib/ directory. 'contrib/' would be the application-level equivalent to the current 'system/' directory; it would contain all bundles that are required to run your features. After exploding a feature assembly into the contrib/ directory, Karaf should scan the directory structure for feature repository files, and add these dynamically to the runtime. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The result? If we implement these two enhancements to Karaf, we'll end up with a double-whammy. Developers will find it incredibly easy to create feature assemblies. Administrators and operations folk will be delighted that all the have to do is copy a feature assembly to the deploy directory, and then ssh into the Karaf/ServiceMix runtime and list, install and upgrade or rollback features using the 'feature' commands.&lt;br /&gt;&lt;br /&gt;If you like these proposals, please vote for the issues!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-7375777393460002899?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/7375777393460002899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=7375777393460002899' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7375777393460002899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7375777393460002899'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/08/karafs-fabulous-features-and-what-you.html' title='Karaf&apos;s Fabulous Features, and, what &lt;b&gt;you&lt;/b&gt; can do to make them even more fabulous'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-3107578861646294626</id><published>2010-08-23T04:50:00.000-07:00</published><updated>2010-08-23T04:59:50.529-07:00</updated><title type='text'>Seeing the wood for the trees: a &lt;treeConnector&gt; for ActiveMQ?</title><content type='html'>I have proposed a treeConnector for ActiveMQ - see the &lt;a href="https://issues.apache.org/activemq/browse/AMQ-2875"&gt;JIRA issue here&lt;/a&gt; and please vote if you like it. Am including the text of the proposal below.&lt;br /&gt;&lt;br /&gt;The ActiveMQ network connector is excellent at facilitating self-organizing networks of ActiveMQ brokers with dynamically discovered routing, and can be used in situations where network availability is sporadic and not guaranteed. Network connectors can be used along with master-slave pairs to create a distributed ‘messaging fabric’. The network connector can also accommodate the creation of hierarchical networks, however, I believe there is a good argument for treating tree topologies as a special case in their own right. In this note, I’m going to describe why trees should be treated as a special case, and describe what a treeConnector might look like.&lt;br /&gt;&lt;br /&gt;Hierarchical (or ‘tree’) networks are a special case of the abstract notion of a network; they have numerous applications in the real world in cross-geography, wide-area deployments. Consider a retail organization with 1,000’s of stores, who wish to send and receive information to and from head-quarters (HQ) and the stores: you can envisage a hierarchy of ActiveMQ brokers: one for HQ, one for each of the regions (e.g. Ireland, UK, France, Germany), and then a broker in each store/outlet in each of the regions. When HQ wants to send a message to a store, it should be able to write a message to the store’s queue and have it dynamically routed to the store via the regional broker. Likewise, if a store wants to send a message to HQ, it should be able to write to a local queue in the store and have the message dynamically routed to HQ.&lt;br /&gt;&lt;br /&gt;Right now in ActiveMQ, there are a number of issues with using a network connector to achieve a tree topology:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Spillage of consumer advisories. When a consumer connects to a store, an advisory message is generated and sent to all brokers within the networkTTL range. These advisories don’t just travel up the tree to the top (HQ): they can also spill back down the tree to peers who are simply not interested. We have seen this in a network with 1,000 brokers connected to a regional broker, and a networkTTL of two: the advisory gets sent to the regional broker, HQ, *and* the 999 peers of the broker. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Resource wastage (as a consequence of spillage). When a consumer advisory from a store broker (say, broker ‘A’) reaches another broker within the networkTTL (say, broker ‘B’), then ‘B’ creates a subscription for the destination (to do forwarding) *and* can result in the allocation of a thread for this destination. So, it’s possible that Broker B will allocate a thread for the destination ‘BrokerA.Incoming’, despite the fact that it will never receive or send to this queue. If there are only a small number of peers at this level then this is not a problem; however, if there are many peers (as in the case of 1000 stores per region) then this will be noticeable.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Sensitivity to networkTTL. In order to minimize spillage and resource wastage, you need to se the networkTTL on each broker to the distance between the broker and the root - in this example, 2. However, a later reconfiguration of the network could result in this setting being too low (which means messages won’t go the distance) or too high (which means you get inadvertent spillage)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;These issues can be addressed if we create a new tree connector for ActiveMQ:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Brokers would identify themselves as ‘leaf’, ‘branch’ or ‘root’ nodes. There should only ever be one root. If a broker has not been identified as either ‘leaf’ or ‘branch’ then it should consider itself to be the root.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Tree connectors would be configured using a ‘many to one’ approach. Leaf brokers would configure a tree connector to their branch. Branch brokers would configure a tree connector to the root. The root shouldn’t need to configure anything, except of course a transport listener. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;So, a branch broker for the ‘UK’ region might have the following  (to connect to headquarters):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &amp;lt;treeConnector nodetype="branch" uri="tcp://headquarters.myorg.com:61616"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And, a leaf broker at a store or outlet in the UK might have the following (to connect to the ‘UK’ region’):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;treeConnector nodetype="leaf" uri="tcp://uk.myorg.com:61616"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;If a consumer connects to a leaf node, then the consumer advisory travels up the tree, all the way to root: the concept of networkTTL is ignored. If this advisory travels through a ‘branch’ then the branch delegates the advisory upwards. Branches do not pass advisory messages from children to their other child nodes.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;If a consumer connects to a branch node, then the consumer advisory travels up the tree. Additionally, the branch broker will send the advisory downwards to its children.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;If a consumer connects to the root, then the consumer advisory is filtered downwards to all children.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt; &lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;In this way, we reduce spillage of advisory messages, and ensure that trees can self organize without too much intervention or worrying about the network time-to-live.&lt;br /&gt;&lt;br /&gt;Thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-3107578861646294626?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/3107578861646294626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=3107578861646294626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3107578861646294626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3107578861646294626'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/08/seeing-wood-for-trees-for-activemq.html' title='Seeing the wood for the trees: a &amp;lt;treeConnector&amp;gt; for ActiveMQ?'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5249637027012780589</id><published>2010-08-13T07:58:00.000-07:00</published><updated>2010-08-13T08:24:17.958-07:00</updated><title type='text'>An easy, useful, NMR: Monsieur Nodet, vous êtes une légende.</title><content type='html'>I was discussing the ServiceMix NMR component this week with a colleague; and my interest was piqued enough to take a fresh look at this little fella. I grew to dislike the JBI NMR some time ago, and have written about these feelings a number of times on this blog. But its time to draw a line under those dark times, and look to the future. And, in the brave new world of ServiceMix 4, the new NMR becomes lightweight, liberating, and startlingly &lt;em&gt;useful&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Rather than explain the technology first, let's talk about the problem that it might solve. In ServiceMix, you can deploy integration or business logic as OSGi bundles - this much we know. Now, say you want to send some information between two bundles: how can you do it? There are a number of options open to you - here's some of the most popular options.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use OSGi services. I'm a huge fan of the POJO-based approach that comes with OSGi services. It's easy to use. Drawbacks? There are two I can think about - whether they're relevant to your use case will depend on, well, your use-case. First, the call is always going to be executed synchronously on the callers thread. If you've got lots of throughput going through the system, this may not be desirable. Second, in order to invoke on the OSGi service, you will need to marshal your incoming payload into POJO objects: maybe this marshaling is something you simply don't want to do. Maybe you just want to pass data through the system as fast as you can.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use JMS queues. We love ActiveMQ, and ServiceMix is tightly integrated with ActiveMQ. But it seems that forcing the use of a JMS queue just to send some information from A to B, in the same JVM, feels like overkill - despite all the underlying optimizations available in ActiveMQ for in-memory messaging.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Use the NMR. Ching! The penny drops. The ServiceMix NMR allows you to send &lt;span style="font-style: italic;"&gt;anything&lt;/span&gt; to another bundle, and allows you to do this either synchronously or asynchronously. So: you get choice on whether you want your code to be handled on a separate thread. And (and this is the best bit) the NMR, unlike the old JBI NMR, does not demand that the payload be XML. You could send your granny through. If your Granny was a Java Object. If it wouldn't cause too much confusion, I'd vote for a name change, and call this the Denormalized Message Router (DMR), as it no longer tries to enforce a canonical format.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Playing with this, I put together a little demo in a few minutes where one bundle did a file pickup (of a non-XML file) via Camel, sent the file to an NMR service in another bundle over the NMR, where the file is processed. Worked a treat. No pain. I was shocked at how easy this worked. The other thing that shocked me was how simply the Camel-NMR component is to configure. I was expecting tricks like 'you must provide an XML QName to describe your endpoint', or any number of other intellectual land-mines. But the short page of documentation on the Camel website was all I needed. &lt;br /&gt;&lt;br /&gt;So where do I go from here? I feel really, really positive about this NMR now, in a way that I didn't before. It's become a technology I can use without having to worry about the mechanics underneath, like how I can drive my car without having to know how my engine works.&lt;br /&gt;&lt;br /&gt;I must compliment Guillaume Nodet's work in this area. Taking the hard stuff out, and leaving a very useful and very usable NMR core, is smart thinking.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5249637027012780589?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5249637027012780589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5249637027012780589' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5249637027012780589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5249637027012780589'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/08/easy-useful-nmr-monsieur-nodet-vous.html' title='An easy, useful, NMR: Monsieur Nodet, vous êtes une légende.'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-1349963434890592113</id><published>2010-08-10T23:00:00.000-07:00</published><updated>2010-08-10T23:02:41.334-07:00</updated><title type='text'>OK OK OK I give up: I’m getting really weary of XML</title><content type='html'>At a water-cooler in a global Swiss financial institution I had a great chat with an enterprise architect. How’s it going? he asked. The correct answer to such questions is normally just to politely say ‘grand, thanks’. This time though I opened up and let out on what what has been a burning, smoldering, nagging realization: I’m getting really, really tired of XML. It’s everywhere. It’s on my queues, it’s in my SOAP messages, it’s in my integration flows, it’s in my configuration (thanks Spring!). It’s unwieldy, it’s unkind, it’s finicky, it’s bloated and most of the time it’s plain unreadable. In the last few weeks I’ve been debugging some difficult SOAP integration flows, and despite my ability to parse XML in my head, I’m finding it tiresome.&lt;br /&gt;&lt;br /&gt;Did XML really deliver what it said it would? All those great features... Schema Validation: a great feature, but rarely powerful enough, and one most users end up disabling for performance reasons. XSLT? Cryptic. XPath: very cool, and very useful. XQuery: never got to use it in anger. Namespaces? Overly complicated and very messy when you start to use large numbers in the same message. Versioning? You have to do it with namespaces, and even then it’s very tricky to roll it out - do it wrong, and your versioning scheme just amounts to rolling out new schema releases that are incompatible with those of the past. Dynamic resolution of namespaces from the web? How many times have I had something work in development only to have it break in pre-production environments because those machines are fire-walled and can’t reach the outside world?! Partial message encryption and digital signatures? Very cool, but one of those advanced features that many people may never get to use.&lt;br /&gt;&lt;br /&gt;Rant over.&lt;br /&gt;&lt;br /&gt;But what happened at the water cooler? Our conversation became animated, exciting, and in the end cut far too short by pressing and more immediate work issues. Here’s the gedanken experiment: could we provide a set of enterprise services - providing things like access to data and core business task and transactions - *without* using XML all? If so, then what would it look like? Here’s some of the options we discussed in our brief encounter:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Revitalize IDL and the Common Data Representation of CORBA. Great stuff, CORBA (I salute you). However, CORBA got some things wrong: the representations are binary not human readable without appropriate tools. There’s no technology that allows you to XPATH style querying of data (very nice if you want to access just one part of the payload, instead of unmarshaling the whole kit and kaboodle). Also, IDL mappings to languages like Java, C++ and others tended to be clunky and are certainly dated at this stage.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JSON. Who can argue with simplicity of a data format that can be described in a single HTML page, is simple and fast to parse, and is supported by oodles of languages (see http://json.org). Great stuff indeed, and I think this is an area very much worthy of investigation further. Bringing in schema definitions for JSON allows us to be more specific about the content that can be held in JSON payload - another plus [need citation]. I think JSON would need more though to make it truly ‘enterprisey’: for example, need an XPATH-like way to get into parts of the payload. And, how can you do things like partial message encryption?&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CSV. Don’t dismiss this one straight away. Comma separated value format, and it’s close cousins ‘fixed width fields’ and ‘name-value pairs’ are arguably the simplest formats around, providing minimal overhead.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Serialized Java Objects. I shudder at the though of restricting my data to a single programming language. No thanks. Enough said.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The options above are not exhaustive, and I have not included other approaches that may be in the pipeline. I have a prescient CORBA-savvy friend who stood firm on all of this ten years ago and said ‘Screw this XML stuff. It’s rubbish and will all blow over when people realize that’ (I paraphrase for emphasis - I’m sure he used slightly different words; however, his passion on the subject was clear). He’s written his own payload format that quite possibly will destroy XML, if it catches on.&lt;br /&gt;&lt;br /&gt;In our water cooler discussion we didn’t come to any conclusions; there is no ‘winner’ here. However, there is a strengthening of something I’ve always believed since I got into middleware: there is no single, perfect, complete solution. Heterogeneity is crucial in operating systems, hardware platforms, programming languages, and frameworks; there is no reason why supporting heterogeneity of middleware transports and payloads should be any less important. Understanding that the conditions whereby one approach is better than another is key, and far more valuable than adopting a ‘one-size-fits-all’ approach. And then adopting open standards and technologies that can support this heterogeneity (and here I can smugly wear my ServiceMix, CXF and Camel hat) is the next most important thing. When I think of how CXF does RESTful content negotiation my mouth waters.&lt;br /&gt;&lt;br /&gt;And so reinvigorated, I returned to work, and tamed the outstanding XML issues on my plate. As I lid-down for the night, I fear that some day this blog entry will haunt me, but I shall publish and be damned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-1349963434890592113?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/1349963434890592113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=1349963434890592113' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1349963434890592113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1349963434890592113'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/08/ok-ok-ok-i-give-up-im-getting-really.html' title='OK OK OK I give up: I’m getting really weary of XML'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-6607962114578993888</id><published>2010-06-30T07:54:00.000-07:00</published><updated>2010-06-30T08:18:16.404-07:00</updated><title type='text'>The six thousand topic man: hosting many topics in the same ActiveMQ</title><content type='html'>An ActiveMQ user was enquiring about whether ActiveMQ (get it from &lt;a href="http://fusesource.com/"&gt;fusesource.com&lt;/a&gt;!) could handle a publish-subscribe messaging architecture with six thousand topics. I've often seen production deployments of FUSE support tens to hundreds of JMS destinations; however, I wasn't quite sure how it would perform with a huge number of topics. Of course, you could reduce your number of topics by introducing message selectors on a smaller number of topics: but that avoids the question rather than answering it up front.&lt;br /&gt;&lt;br /&gt;Throwing some questions at the &lt;a href="http://fusesource.com"&gt;FUSE&lt;/a&gt; engineering team got back a lot of confidence that it would indeed work just fine. Still though, I always like to try things and out and see for myself. So, I slapped together a JMS client that wrote 1,000,000 non-persisted messages to 6,000 JMS topics. Then, I put together another JMS client with 6000 consumers, with appropriate session and connection pooling in place. The result? Alarmingly straightforward: it worked just fine! While quietly content with this outcome, it's worth mentioning some background things I did on the Broker...&lt;br /&gt;&lt;br /&gt;First, I needed to switch off the default 'thread-per-consumer' model in ActiveMQ. This is done by setting the JVM system variable -Dorg.apache.activemq.UseDedicatedTaskRunner=false - by default, this is set to 'true' in the ./bin/activemq[.bat] startup script. I tested what happens if I leave this to 'true' and indeed I ended up with 6,000 threads in the broker. Ouch. When you disable this setting, the consumers are served from a pool of threads, and total thread count never got above sixty threads.&lt;br /&gt;&lt;br /&gt;Next, I configured the Broker's transport connector to use 'nio:' rather than 'tcp:': this means we get a cleaner, more scalable threading model within the broker. &lt;br /&gt;&lt;br /&gt;And so, it all works just fine. &lt;a href="http://www.nighttale.net/"&gt;Dejan Bosonac's&lt;/a&gt; article on &lt;a href="http://www.nighttale.net/activemq/python-messaging-activemq-and-rabbitmq.html#scalability"&gt;Python messaging: ActiveMQ and RabbitMQ&lt;/a&gt; suggests that you can get up to as much as 32,000 JMS destinations on a single broker; that's good to know, but I can't think of a situation where I'd need that right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-6607962114578993888?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/6607962114578993888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=6607962114578993888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6607962114578993888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6607962114578993888'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/06/six-thousand-topic-man-hosting-many.html' title='The six thousand topic man: hosting many topics in the same ActiveMQ'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-6608986644443050305</id><published>2010-06-29T09:42:00.001-07:00</published><updated>2010-06-30T01:35:08.227-07:00</updated><title type='text'>ActiveMQ pooling: a pool by any other name would smell as sweet</title><content type='html'>Working with a FUSE customer today who voiced confusion at all the different ways you can do a pooled connection factory in ActiveMQ. With confusion comes fear, uncertainty and distrust. Should I be using Jencks? Or should I be using the Spring CachedConnectionFactory? Wasn't there something on the activemq-pool documentation that said it didn't actually pool consumers? Help!&lt;br /&gt;&lt;br /&gt;I took this confusion directly to the source, and had an enlightening discussion with James Strachan and Gary Tully at &lt;a href="http://fusesource.com"&gt;FuseSource&lt;/a&gt;about this. As a nice drop off, we ended up updating the documentation on &lt;a href="http://camel.apache.org/activemq.html"&gt;Camel ActiveMQ&lt;/a&gt;, &lt;a href="http://activemq.apache.org/spring-support.html"&gt;ActiveMQ Spring Support&lt;/a&gt;, and the Javadoc for the org.apache.activemq.pool.PooledConnectionFactory. &lt;br /&gt;&lt;br /&gt;The bottom line is this: while Jencks was recommended in the past, it's no longer necessary as you can just use the org.apache.activemq.pool.PooledConnectionFactory from activemq-pool project. Alternatively, you can of course use the Spring CachedConnectionFactory, as outlined in this &lt;a href="http://codedependents.com/2009/10/16/efficient-lightweight-jms-with-spring-and-activemq/"&gt;great article&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Here's the real sneaky thing though: the JavaDoc documentation of org.apache.activemq.pool.PooledConnectionFactory suggested that this connection factory doesn't pool consumers. This is in fact &lt;em&gt;not&lt;/em&gt; not a drawback or a failing: it simply doesn't make sense to 'pool' JMS consumers. Maintain a collection of them for concurrent consumption in parallel? Sure! But keep a 'pool' of consumers, whereby you return consumers into the pool for reuse later on when you're finished? Don't do it! It simply doesn't make much sense - and, at a technical level - could end up creating havoc as the 'idle' consumers would still get messages delivered to their internal 'prefetch' queues, where they'd dwell until the consumer is activated again. We updated the documentation to better explain what the PooledConnectionFactory does. &lt;br /&gt;&lt;br /&gt;We realized that the confusion comes from a number of outdated resources on the web that mentioned a myriad combination of ways to do pooling. That, and, the fact that it's easy to confuse the different concepts of 'pooling' and simply maintaining a collection of resources: the former involves sharing and reuse, while the latter does not.&lt;br /&gt;&lt;br /&gt;Bottom line: forget about Jencks. Use activemq-pool's PooledConnection or Springs CachedConnectionFactory to manage your connection, session and producer pools. And don't go talking about 'consumer pools' - it really doesn't make sense - talk about 'collections of consumers'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-6608986644443050305?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/6608986644443050305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=6608986644443050305' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6608986644443050305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6608986644443050305'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/06/activemq-pooling-pool-by-any-other-name.html' title='ActiveMQ pooling: a pool by any other name would smell as sweet'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-732219915004869818</id><published>2010-04-23T08:48:00.000-07:00</published><updated>2010-04-23T09:21:40.566-07:00</updated><title type='text'>Four things you need to know about the new JBI cluster engine in ServiceMix 4</title><content type='html'>My thanks to Gert Vanthienen, who helped clear the light today as I dug my way through some odd behaviour from the new JBI clustering mechanism in ServiceMix 4 - odd behaviour that was down to some configuration 'gotchas'. I've written about this clustering mechanism before on an &lt;a href="http://trenaman.blogspot.com/2009/03/new-jms-flow-in-servicemix-4.html"&gt;earlier blog&lt;/a&gt;; there are, however, a number of tricks you need to know about the way to use this mechanism, and I think it's worth mentioning here.&lt;br /&gt;&lt;br /&gt;&lt;list&gt;&lt;br /&gt;&lt;li&gt;Make sure you register all JBI endpoints when using the OSGi packaging&lt;/li&gt;.&lt;br /&gt;&lt;li&gt;Cluster the endpoint the sends to the NMR, not the endpoint that receives (this is counter-intuitive!)&lt;/li&gt;.&lt;br /&gt;&lt;li&gt;If using a network of brokers, disable conduitSubscriptions on the ActiveMQ network connector.&lt;/li&gt;.&lt;br /&gt;&lt;li&gt;Give each SMX instance a unique clusterName&lt;/li&gt;.&lt;br /&gt;&lt;/list&gt;&lt;br /&gt;&lt;br /&gt;Note: I still haven't fully made my peace with JBI; however, I must say that I'm mellowing a little now that ServiceMix 4 allows you to do simpler packaging (as bundles rather than as service-assemblies) &lt;i&gt;and&lt;/i&gt; provides some optimizations to get rid of excessive NMR traffic. Anyway: on to that list:&lt;br /&gt;&lt;br /&gt;First, &lt;b&gt;make sure you register your endpoints as JBI endpoints&lt;/b&gt;. If you're using the new OSGi packaging of JBI endpoints (which I recommend!) then make sure you add the appropriate EndpointExport to your Spring context. You would of course be doing this for non-clustered JBI endpoints, but you do also need to be doing this for clustered endpoints as well.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;bean class="org.apache.servicemix.common.osgi.EndpointExporter" /&amp;gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Second, &lt;b&gt;cluster the producer, not the consumer&lt;/b&gt;. You would think that 'clustering' would involve some kind of configuration for each of the replicated endpoints 'listening' on the NMR. However, in the SMX 4 implementation, it goes the other way. You need to cluster the endpoint that's putting the information &lt;i&gt;onto&lt;/i&gt; the NMR. For example, if you have a file poller endpoint, and you want to send the incoming file to a cluster of bean consumers, you need to 'cluster config' the file-poller using the &lt;code&gt;OsgiSimpleClusterRegistration&lt;/code&gt; bean. This is entirely non obvious; here's how to do it. On the file-poller, do:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt; xmlns:file="http://servicemix.apache.org/file/1.0"&lt;br /&gt; xmlns:clu="http://fusesource.com/clusterdemo"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://servicemix.apache.org/file/1.0 http://servicemix.apache.org/schema/servicemix-file-2009.01.xsd&lt;br /&gt;       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;file:poller id="filePoller" service="clu:file-poller" endpoint="endpoint"&lt;br /&gt;  targetService="clu:payload-receiver" file="/tmp/incomingXML" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;bean&lt;br /&gt;  class="org.apache.servicemix.jbi.cluster.engine.OsgiSimpleClusterRegistration"&amp;gt;&lt;br /&gt;  &amp;lt;property name="endpoint" ref="filePoller" /&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean class="org.apache.servicemix.common.osgi.EndpointExporter" /&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;and for the 'clustered' bean endpoint, you can omit the &lt;code&gt;OsgiSimpleClusterRegistration&lt;/code&gt; bean: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt; xmlns:bean="http://servicemix.apache.org/bean/1.0" xmlns:clu="http://fusesource.com/clusterdemo"&lt;br /&gt; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://servicemix.apache.org/bean/1.0 http://servicemix.apache.org/schema/servicemix-bean-2010.01.0-fuse-01-00.xsd&lt;br /&gt;       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;bean:endpoint id="beanConsumer" service="clu:payload-receiver" endpoint="endpoint"&lt;br /&gt;  bean="#myBean" /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;bean id="myBean" class="org.file.processor.su.MyBean" /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;bean class="org.apache.servicemix.common.osgi.EndpointExporter" /&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Third, and this is the trickiest, &lt;b&gt;disable conduit subscriptions when using networked brokers&lt;/b&gt;. If you are using a network of embedded brokers for your internal cluster queue, you &lt;b&gt;must&lt;/b&gt; disable conduit subscriptions to ensure that the use of message selectors is respected across the different consumers listening on the cluster queue. How do do this? Simply set &lt;code&gt;conduitSubscriptions=false&lt;/code&gt; on your network connector; something like this: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        &amp;lt;networkConnectors&amp;gt;&lt;br /&gt;            &amp;lt;networkConnector name="brokerA" uri="static://(tcp://localhost:61616)" duplex="true"&lt;br /&gt;            conduitSubscriptions="false"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And, lastly, you do need to give each instance of SMX a unique name for clustering purposes. You can do this be dropping a file called 'org.apache.servicemix.jbi.cluster.engine.config.cfg' into the &lt;code&gt;etc/&lt;/code&gt; directory of your ServiceMix 4 instance. In this properties file, you can provide a variable called 'clusterName' to identify the this ServiceMix instance in the cluster. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;clusterName = smx1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And that's it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-732219915004869818?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/732219915004869818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=732219915004869818' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/732219915004869818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/732219915004869818'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/04/four-things-you-need-to-know-about-new.html' title='Four things you need to know about the new JBI cluster engine in ServiceMix 4'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-302063268116020201</id><published>2010-02-10T23:46:00.000-08:00</published><updated>2010-02-11T11:27:28.957-08:00</updated><title type='text'>New book on CXF by Packt</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_PAIXbU4eQiw/S3RZ9Zc6KSI/AAAAAAAAA54/0z8KbiWwriQ/s1600-h/CXF-Book-Cover.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 259px; height: 320px;" src="http://2.bp.blogspot.com/_PAIXbU4eQiw/S3RZ9Zc6KSI/AAAAAAAAA54/0z8KbiWwriQ/s320/CXF-Book-Cover.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5437069561482062114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Great to see that Packt have published a &lt;a href="http://www.packtpub.com/apache-cxf-web-service-development/book"&gt;book on CXF&lt;/a&gt;. As a project, &lt;a href="http://cxf.apache.org"&gt;CXF&lt;/a&gt; has been consistently establishing itself over the last few years, with a growing community, and, importantly, an increased footprint in production systems. That a publishing house has finally gotten around to putting a book together on CXF is a great endorsement of the project’s success. A copy of the book is winging it’s way to me as I write, so I look forward to providing a fuller review when I get it.&lt;br /&gt;&lt;br /&gt;*Sigh*. This is the book I would have liked to have written if I had had the time ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-302063268116020201?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/302063268116020201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=302063268116020201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/302063268116020201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/302063268116020201'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2010/02/new-book-on-cxf-by-packt.html' title='New book on CXF by Packt'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_PAIXbU4eQiw/S3RZ9Zc6KSI/AAAAAAAAA54/0z8KbiWwriQ/s72-c/CXF-Book-Cover.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-9196086614896375773</id><published>2009-08-10T06:03:00.000-07:00</published><updated>2009-08-10T06:07:08.517-07:00</updated><title type='text'>Camel vs. JBI</title><content type='html'>People are, in general, blown away by Camel. Hearts melt and grown men weep with joy when they learn how easy it is to write an integration flow, package it as an OSGi bundle, and then drop it into the FUSE ESB 4 container. But when the emotions have subsided and rationality comes again to the fore, I often hear the question ‘if Camel can do so much so easily, then why do I need JBI anymore?’. The answer is, that in many cases, you *don’t*. &lt;br /&gt;&lt;br /&gt;This is hard for some ServiceMix users to stomach, and delightful to others. I have written before about my ‘&lt;a href="http://trenaman.blogspot.com/2008/02/fuse-esb-and-jbi-my-new-found-loves.html"&gt;love affair&lt;/a&gt;’ with JBI on this blog, a love affair that was soon to be blighted by some hardened home truths about what really goes on on the &lt;a href="http://trenaman.blogspot.com/2008/11/jmsjca-flows-in-servicemix-wrong-level.html"&gt;NMR&lt;/a&gt;. With my JBI relationship in almost tatters, I embraced Camel with open arms. Am I on the rebound? Hardly. Camel is simply a better technology choice when implementing ESB solutions than JBI. What makes it better? A great DSL (domain specific language) for implementing integration patterns. Extensible beyond Java into other scripting languages and technologies. No canonical intermediary format (XML). Dynamic routing. On-demand type conversion. Parameterizable routes (do *that* with JBI!). Support for unit testing of routing logic with ‘mock’ endpoints. An extensive list of technology components, with easy-to-use URI configuration. All these things make for a faster way to produce more with less. &lt;br /&gt;&lt;br /&gt;With all these things going for it, then why continue to support JBI in ServiceMix/ FUSE ESB 4? There are a number of good reasons, and, I like to think that while my amorous intentions for JBI are firmly in the past, we do now remain “Just Good Friends’. There are many users out there who currently rely on JBI solutions, and there are a certain number of users for whom the JBI architecture is a cornerstone of a larger enterprise architecture. For these users, JBI will always be important: one of the reasons why is the promise of a standards-based modular architecture. This is good in large organizations because the adherence to a standard (i.e., the JBI 1.0 specification), you know that a component written by one of your teams in, say, Texas, will work when deployed in JBI a solution developed by a team in Hyderabad. Or, alternatively, a component written by a third-party for a CRM System will plug right into your JBI framework.&lt;br /&gt;&lt;br /&gt;Of course, you can get this kind of plug’n’play with Camel - the Camel architecture and APIs are open source! However, some enterprises are going to be wary of working to an API that could change at the whim of a community, and prefer the solidity and comfort that only a standards-based specification can afford. I can appreciate this argument. However, I must respond that, if I were Chief Architect, I’d rather join in with a thriving open source community than a specification that’s been largely untouched and unrevised for some time, such as JBI 1.0. &lt;br /&gt;&lt;br /&gt;All that aside, it’s clear that what’s right for some organizations is typically not right for others. ServiceMix (and FUSE) is all about supporting the integration community and, most importantly, offering choice. The advice I give my customers is to use Camel as the integration technology of choice, with an underpinning of ActiveMQ for reliable, asynchronous messaging and a touch of CXF for providing SOA or RESTful facades - all deployed in FUSE ESB 4 using OSGi. For me, the JBI container that used to be at the centre of ServiceMix / FUSE ESB is now a simply a feature that can be used to integrate with third-party or existing components that conform to the JBI specification. Camel, through the ‘jbi:’ and ‘nmr:’ components, can interoperate with such components as necessary. You get the best of all worlds.&lt;br /&gt;&lt;br /&gt;To the JBI warriors out there, I salute you. You were not wrong. It’s just that there’s a new ‘right’ in town.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-9196086614896375773?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/9196086614896375773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=9196086614896375773' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/9196086614896375773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/9196086614896375773'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/08/camel-vs-jbi.html' title='Camel vs. JBI'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-6579466412657462015</id><published>2009-04-10T04:51:00.001-07:00</published><updated>2009-04-10T05:04:25.222-07:00</updated><title type='text'>OSGi and dOSGi - from the source</title><content type='html'>Very excited about some upcoming webinars on &lt;a href="http://fusesource.com/resources/video-archived-webinars/"&gt;fusesource.com&lt;/a&gt;: two legends of OSGi will be talking about why, what and how of OSGi technology. On April 14th (my birthday :)), Eric Newcomer, co-chair of the OSGi Enterprise Expert Group, is going to give an overview of OSGi for the enterprise. Then, on April 28th, the legendary David Bosschaert, one of our Fellow engineers at Progress, and based here in Dublin, will talk about Disributed OSGi. dOSGi answers the natural question asked by OSGi newcomers when the learn about OSGi services: is there any way we share the service registry across a number of JVMs, so that a consumer in one JVM can lookup and invoke on a service in another JVM transparently? David, a committer on Apache CXF, has implemented early prototypes on how to make this happen under the covers, and, I believe, has set CXF up to be part of the reference implementation for dOSGi. &lt;br /&gt;&lt;br /&gt;I'm gonna grab me a sandwich log in to these webinars: they're too good to miss! &lt;br /&gt;&lt;br /&gt;I note as well that registration at the webinars entitles you to a 10% discount on our online, live training sessions on Apache Camel &amp; Apache ServiceMix 4. It's all good.  We ran our first delivery of this course this week, and I was genuinely surprised with how our students coped with - and enjoyed! - the online learning experience. Two days of webinars, live coding, exercises, demonstration, chat via IRC, and access to our tech support guys. Of course, I was very lucky to have Hadrian Zbarcea, PMC chair of the Apache Camel project, with me for the duration, piping in with some great input where Camel is going. Nice.&lt;br /&gt;&lt;br /&gt;But anyway: for now, I'm off for Easter...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-6579466412657462015?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/6579466412657462015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=6579466412657462015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6579466412657462015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6579466412657462015'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/04/osgi-and-dosgi-from-source.html' title='OSGi and dOSGi - from the source'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5685101441833509171</id><published>2009-03-26T06:01:00.001-07:00</published><updated>2009-03-26T06:05:18.758-07:00</updated><title type='text'>Muscle meets Might</title><content type='html'>Just saw the article on &lt;a href="http://www.press.redhat.com/2009/03/25/red-hat-adds-muscle-to-apache-cxf/"&gt;Red Hat Adds Muscle to Apache CXF&lt;/a&gt;. Hurrah! This is a great thumbs up and vote of confidence for the great work that has been done by the Apache CXF community. Bringing in this muscle, and combining it with the might of the many committers of the CXF project, lead by &lt;a href="http://fusesource.com"&gt;fusesource.com's&lt;/a&gt; Dan Kulp, is going to establish CXF further as the de facto implementation for open-source web services.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5685101441833509171?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5685101441833509171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5685101441833509171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5685101441833509171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5685101441833509171'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/03/muscle-meets-might.html' title='Muscle meets Might'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-3204326610759024541</id><published>2009-03-26T02:41:00.001-07:00</published><updated>2009-03-26T03:00:05.854-07:00</updated><title type='text'>The new JMS flow in ServiceMix 4</title><content type='html'>I wandered down to the hotel bar last night and bumped into Guillaume Nodet; we got chatting about the new support for JMS flows in ServiceMix 4. I've written about JMS / JCA flows in a &lt;a href="http://trenaman.blogspot.com/2008/11/jmsjca-flows-in-servicemix-wrong-level.html"&gt;previous blog entry&lt;/a&gt;, arguing that, if not correctly configured, they can lead to far too much distribution and a consequent impact on performance. Back then, I argued that using explicit JMS queues - through ActiveMQ or whatever JMS broker you want - can provide just as effective a mechanism for distribution, message persistence, reliability and location transparency.&lt;br /&gt;&lt;br /&gt;The latest stuff in SMX4 introduces some new stuff that makes me feel a lot happier about the concept of implementing the NMR with a JMS flow. First, if you want a JBI endpoint to be clustered, you have to explicitly mark it as clustered. This I like, as it gives the developer/designer back control of where the distribution points are in a flow. Second, the JBI flow now uses a single distributed queue for clustering. Previously in ServiceMix 3 a seperate queue was created for each JBI endpoint using the JMS flow; the new approach means less queues and less threads required to support the JMS flow. Different JBI endpoints will listen off the "NMR" queue using optimized message selectors to ensure that messages get consumed by the correct target services. Third, you can now optimize the JBI messaging layer to omit the use of JBI DONE messages: so, if you're implementing a one-way interaction over the JMS flow, you don't end up having to deal with an DONE that you simply don't need. Finally, Guillaume has made a cleaner separation between the JMS flow and the underlying JMS transport. So, you can use ActiveMQ if you want, or, alternatively, plug in another JMS broker to handle your JBI traffic.&lt;br /&gt;&lt;br /&gt;I'm looking forward to playing with this, and perhaps documenting these new features. One clear point is that if you've made use of JMS flows in your architecture for ServiceMix 3, then you'll have that same support in ServiceMix 4, with just a little tweaking of configuration. &lt;br /&gt;&lt;br /&gt;Good work, Guillaume! And, thanks again for the sandwich!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-3204326610759024541?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/3204326610759024541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=3204326610759024541' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3204326610759024541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3204326610759024541'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/03/new-jms-flow-in-servicemix-4.html' title='The new JMS flow in ServiceMix 4'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-2920006492208187020</id><published>2009-03-25T10:09:00.000-07:00</published><updated>2009-03-27T05:02:26.713-07:00</updated><title type='text'>HamsterJam, ApacheCon, and building businesses out of Apache Software License</title><content type='html'>Just thought I'd check in from ApacheCon EU 2009 in Amsterdam. This definitely one of the most engaging conferences I've had the good fortune to attend. Yesterday I gave a one day workshop on building web- and RESTful services using &lt;a href="http://fusesource.com/products/enterprise-cxf/"&gt;Apache CXF&lt;/a&gt;, showing also how to plug in the JMS transport into CXF so that you can do XML/JMS or SOAP/JMS from JAX-WS code. I was blessed with a really good audience, which made for a fun day. Had an interesting scrape though: throughout the day my MacBookPro kept on 'freezing' out of the blue! Not the kind of thing you want when you're doing live-coding: took me eight hours to figure that this was happening because I'd left my bluetooth mouse on in my bag, and it was periodically taking control of my machine whenever it could make a connection. Ouch! &lt;br /&gt;&lt;br /&gt;Today I broke with my usual tradition of doing technical talks to join the business track, where I got to follow up after a great panel discussion with my own talk, &lt;a href="http://www.eu.apachecon.com/c/aceu2009/sessions/143"&gt;Adopting Open Source in the Enterprise&lt;/a&gt; (follow the link to pick up PDF of the slides). I also really enjoyed Paul Fremantle's talk on building business out of Apache Software License, which agreed with my own observations on the need for ASL-based business to give &lt;em&gt;real&lt;/em&gt; business value in terms of their support, services, training and consulting. In my own talk I had talked about Ricardo's Law of Competitive Advantage, and how organizations will support &lt;em&gt;themselves&lt;/em&gt; in their adoption of open-source &lt;em&gt;unless&lt;/em&gt; a vendor - like Progress with &lt;a href="http://fusesource.com"&gt;FUSE&lt;/a&gt; - can demonstrate that they can provide that support cheaper, better, faster than the organization can do themselves. For me, a vendor offering services around Apache-licensed community software acts as a 'mountain guide', helping users to get most value out of the commons code while minimizing risk.&lt;br /&gt;&lt;br /&gt;Right now I'm in a talk by &lt;a href="http://open-source-adventures.blogspot.com/"&gt;Andreas Gies&lt;/a&gt; (a colleague from Progress) who has such great experience in adoption open source for distributed team development. He's a Maven committer, and, in my eyes, an absolute legend. Go Andreas, Go!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-2920006492208187020?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/2920006492208187020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=2920006492208187020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2920006492208187020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2920006492208187020'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/03/hamsterjam-apachecon-and-building.html' title='HamsterJam, ApacheCon, and building businesses out of Apache Software License'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-6373539450272693528</id><published>2009-03-10T02:30:00.000-07:00</published><updated>2009-03-10T02:35:23.028-07:00</updated><title type='text'>On the question of 'ServiceMix vs Camel'</title><content type='html'>There was an interesting discussion on the ServiceMix users list on how to choose between implementing integration solutions using ServiceMix or camel; thought I'd post my contribution to that discussion here. ServiceMix should really be thought of as a container, that facilitates the deployment of JBI-based integration solutions &lt;em&gt;and&lt;/em&gt; Camel-based solutions for enterprise integration. And, of course, ServiceMix 4 is an OSGi container, which extends the concept of what can be deployed - JBI service assemblies, spring configuration, OSGi bundles, etc.&lt;br /&gt;&lt;br /&gt;The question really becomes "Should I use the ServiceMix JBI components (-eip, -file, -ftp, etc.) or should I just use camel components?" I think the decision around this will depend on whether the JBI architecture forms an important underpinning of your solution: if so, then it makes sense to use the JBI components. If, however, you have no desire to go down the pure JBI route, then you can choose to adopt either a pure Camel or a more blended approach.&lt;br /&gt;&lt;br /&gt;As Chris Custine and Jean-Baptiste have both pointed out, Camel integrates very effectively with JBI, so you can get the best of both worlds. You might find that the JBI servicemix-ftp component is more robust than the camel-ftp component, and choose to use the former as part of a Camel route. Or, you might prefer the servicemix-eip Aggregator's persistence of state over that of the aggregator in Camel.&lt;br /&gt;&lt;br /&gt;So: my advice is, in a nutshell, move forward embracing a blend of both JBI and camel components, and, consider 'ServiceMix' to be a container for both.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-6373539450272693528?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/6373539450272693528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=6373539450272693528' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6373539450272693528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6373539450272693528'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/03/on-question-of-servicemix-vs-camel.html' title='On the question of &apos;ServiceMix vs Camel&apos;'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-3488297651045653984</id><published>2009-02-27T14:28:00.000-08:00</published><updated>2009-02-27T14:30:05.701-08:00</updated><title type='text'>Me and Guillaume, talking our heads off about stuff...</title><content type='html'>... on a &lt;a href="http://blogs.zdnet.com/Gardner/?p=2819"&gt;podcast on ZDNet&lt;/a&gt;, done with Dana Gardner... enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-3488297651045653984?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/3488297651045653984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=3488297651045653984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3488297651045653984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3488297651045653984'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/02/me-and-guillaume-talking-our-heads-off.html' title='Me and Guillaume, talking our heads off about stuff...'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-1080607972177512585</id><published>2009-02-25T01:50:00.000-08:00</published><updated>2009-02-25T02:11:42.414-08:00</updated><title type='text'>FUSE adoption: is it the economy, or just the sheer love of innovation?</title><content type='html'>There's a nice post on the adoption of FUSE ESB on &lt;a href="http://blogs.zdnet.com/open-source/?p=3567"&gt;ZDNet&lt;/a&gt;; in the last few months I've observed an increase in activity and excitement around FUSE. Why might that be? As the entry's quote from Debbie suggests, economic conditions certainly are prompting users to ask questions of their existing close-source providers, and evaluate in more earnest the open-source options and alternatives that are available. &lt;br /&gt;&lt;br /&gt;From my perspective though, it's more than that: at a technical level I think users are seeing that the Apache projects that FUSE is based on - ServiceMix, ActiveMQ, Camel and CXF - offer a new way to rapidly create solutions for integration, SOA, and, REST. The potential for developers to rapidly create integration flows using Camel leaves most battle-hardened integration architects and developers bowled over with excitement. &lt;br /&gt;&lt;br /&gt;And users are excited by OSGi too; I remember the day when Eric Newcomer, ex CTO of IONA, who was pivotal in bringing OSGi forward into the Enterprise computing space, presented to a group of us in Boston on how this OSGi could change the way we think about deploying Java solutions. David Bosschaert, a colleague of mine at Progress, has continued the charge of OSGi, and has put some very interesting stuff on OSGi and on distributed OSGi up on his blog, &lt;a href="http://coderthoughts.blogspot.com/"&gt;&amp;lt;coderthoughts/&amp;gt;&lt;/a&gt;. An of course, the illustrious and prolific &lt;a href="http://gnodet.blogspot.com"&gt; Guillaume Nodet&lt;/a&gt;, also at Progress on the &lt;a href="http://fusesource.com"&gt;fusesource&lt;/a&gt; team, has done great work on driving ServiceMix 4 to an integration-focused OSGi based runtime. &lt;br /&gt;&lt;br /&gt;So whatever the reason - economic pressure or technical advantage - I welcome the surge in FUSE activity :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-1080607972177512585?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/1080607972177512585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=1080607972177512585' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1080607972177512585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1080607972177512585'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/02/fuse-adoption-is-it-economy-or-just.html' title='FUSE adoption: is it the economy, or just the sheer love of innovation?'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-2044774423003531696</id><published>2009-02-18T02:26:00.001-08:00</published><updated>2009-02-18T02:33:10.989-08:00</updated><title type='text'>Free! Free! Free! Screencasts on how to use FUSE ESB 4 (based on Apache Servicemix 4)</title><content type='html'>As part of my bi-weekly "Getting Started with FUSE ESB 4" webinar series, I've put together some screencasts of how to do all the good stuff you want to do with FUSE ESB 4. Check out the links at the bottom of the fusesource.com &lt;a href="http://fusesource.com/resources/video-archived-webinars/"&gt;Training Videos&lt;/a&gt; page. &lt;br /&gt;&lt;br /&gt;Right now the links will download quicktime movies, which you can then run on your machine. The movies range in size from 90Mb to 180Mb, so kick off those downloads, grab a nice cup of coffee, and the sit back and enjoy the ride as I cover how to build and install FUSE ESB 4, create and deploy an OSGi bundle from scratch, create and deploy a web service using CXF, deploy an EIP using a Camel route, and finally, deploy a JBI-based solution into the FUSE ESB 4 runtime.&lt;br /&gt;&lt;br /&gt;If you like the videos, or have feedback, please leave a comment!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-2044774423003531696?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/2044774423003531696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=2044774423003531696' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2044774423003531696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2044774423003531696'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/02/free-free-free-screencasts-on-how-to.html' title='Free! Free! Free! Screencasts on how to use FUSE ESB 4 (based on Apache Servicemix 4)'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5200064289066365777</id><published>2009-02-11T07:31:00.000-08:00</published><updated>2009-02-11T07:44:42.790-08:00</updated><title type='text'>The White Source</title><content type='html'>Ah lovely: a colleague just pointed out an open letter urging &lt;a href="http://www.informationweek.com/story/showArticle.jhtml?articleID=213402101"&gt;Obama To Consider Open Source&lt;/a&gt;. I chuckle with content at the thought of Obama hacking away from the oval office - "Not now Mr. Vice President, I'm in the middle of a maven build. Nearly done. Just one... more... compile..." ;) &lt;br /&gt;&lt;br /&gt;While it's great to see so many players in the open source community willing to step up to the plate, the use of open source in government is not news; it's a trend that started some time ago; the &lt;a href="http://fusesource.com"&gt;FUSE&lt;/a&gt; suite, for example, has a number of prominent government users already. &lt;br /&gt;&lt;br /&gt;Still though, it's great to see the open source movement move forward in a unified way. Who knows: maybe that letter will make it's way onto Obama's desk in the white house...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5200064289066365777?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5200064289066365777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5200064289066365777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5200064289066365777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5200064289066365777'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/02/ah-lovely-colleague-just-pointed-out.html' title='The White Source'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-8883866780604731651</id><published>2009-02-10T11:38:00.000-08:00</published><updated>2009-02-10T11:48:55.804-08:00</updated><title type='text'>The day we brought down the internet :(</title><content type='html'>Today we had the first of our FUSE ESB 4 Webinar series; we had a fabulous triple digit attendance at the session. We dived right into some live coding, showing how to deploy bundles and other artifacts into FUSE ESB, and were all set to tear away with web services, REST, and a whole lot more... until, unfortunately, after an hour of noble service, some machine in some datacentre decided to give up the ghost, leading to the termination of the webinar.&lt;br /&gt;&lt;br /&gt;While it's fun to think that our community's enthusiasm managed to melt some motherboard somewhere, I'm deeply disappointed by this: not just because were about to get the really cool stuff FUSE can do, but also because we had such enormous participation from the attendees who were all very keen to learn more. We'll be working hard to make sure the outage doesn't happen on the next session on February 23rd, when we'll present at 10am GMT and again at 1pm EST. Additionally, I'l be recording some screen casts on each of the six use-cases and we'll post them on fusesource.com.&lt;br /&gt;&lt;br /&gt;Till then, thanks to all our attendees for taking part - we hope you enjoyed our session and look forward to hearing from you again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-8883866780604731651?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/8883866780604731651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=8883866780604731651' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/8883866780604731651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/8883866780604731651'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/02/day-we-brought-down-internet.html' title='The day we brought down the internet :('/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-7167504223634761813</id><published>2009-02-10T02:37:00.000-08:00</published><updated>2009-02-10T07:30:57.495-08:00</updated><title type='text'>JAX-RS in FUSE ESB 4.0.0.3</title><content type='html'>There's a line in RadioHead song "Phew, for a minute there, I lost myself..." I nearly did loose myself yesterday as I tried to reproduce some of &lt;a href="http://rjrojas.blogspot.com/2008/09/restful-web-services-using-iona-fuse.html"&gt;Roberto Rojas's&lt;/a&gt; work on deploying a JAX-RS service in FUSE ESB 4.0.0.3 (based on Apache Servicemix 4). Roberto's blog entry refers to a preview edition of FUSE ESB 4, and things have moved on since then.&lt;br /&gt;&lt;br /&gt;Luckily, I was able to ping off some of the good folk on the CXF project - &lt;a href="http://www.dankulp.com/blog/"&gt;Dan Kulp&lt;/a&gt;, Sergey Beryozkin, and &lt;a href="http://coderthoughts.blogspot.com/"&gt;David Bosschaert&lt;/a&gt;, and they got me going again. There's been some reworking of the JAX-RS support in SMX4, and this you need to update the &lt;span style="font-family: courier new;"&gt;cxf-bundle&lt;/span&gt; in FUSE 4.0.0.3, as per below:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;servicemix&gt; osgi list | utils grep CXF&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[  89] [Active     ] [   50] ServiceMix :: CXF Binding Component (2008.01.0.fuse)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[ 105] [Active     ] [   50] Apache CXF Runtime JBI Binding (2.1.3.fuse)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[ 106] [Active     ] [   50] Apache CXF Runtime JBI Transport (2.1.3.fuse)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[ 107] [Active     ] [   50] ServiceMix :: CXF Service Engine (2008.01.0.fuse)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[ &lt;span style="font-weight: bold;"&gt;142&lt;/span&gt;] [Active     ] [   50] &lt;span style="font-weight: bold;"&gt;Apache CXF Bundle Jar (2.1.3.fuse)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;servicemix&gt; osgi uninstall 142&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;servicemix&gt;&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;osgi install -s mvn:org.apache.cxf/cxf-bundle/2.1.3.3-fuse&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;FUSE ESB 4.0.0.4, released just last night (Feb 9th 2009), already uses version &lt;span style="font-family: courier new;"&gt;2.1.3.3-fuse&lt;/span&gt; of cxf-bundle, so if you're using 4.0.0.4 then you shouldn't need this step.&lt;br /&gt;&lt;br /&gt;With this in place, you can now go and deploy your restful service. For example, I threw together a bundle with a JAX-RS 0.8 service: to install it, I need to install a few dependencies into FUSE ESB 4:&lt;br /&gt;&lt;br /&gt;First, we need the JAX-RS (JSR 311) api. I'm using version 0.8:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;servicemix&gt;&lt;/span&gt; osgi install -s wrap:mvn:javax.ws.rs/jsr311-api/0.8&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next, you need to install the specs locator and the servicemix jsr311-api bundle so that FUSE can locate and load up the spec and implementation correctly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;servicemix&gt;&lt;/span&gt; osgi install -s mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.locator&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;servicemix&gt;&lt;/span&gt; osgi install -s mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jsr311-api-0.8&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While my example isn't using JSON, there is currently a runtime dependency on Jettison, so you need to install that too. You can use the bundle from SpringSource like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;servicemix&gt;&lt;/span&gt; osgi install -s mvn:org.codehaus.jettison/com.springsource.org.codehaus.jettison/1.0.1 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or, alternatively, you can use the cool &lt;span style="font-family:courier new;"&gt;wrap:&lt;/span&gt; functionality to wrap a plain-old java jar&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;servicemix&gt;&lt;/span&gt; osgi install -s mvn:org.codehaus.jettison/jettison/1.0.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hurray! Now with all the prerequisites in place, I can install my JAX-RS service.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;servicemix&gt;&lt;/span&gt; osgi install -s mvn:com.progress.pso/simple-restful-service&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And now my RESTful service works a treat :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-7167504223634761813?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/7167504223634761813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=7167504223634761813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7167504223634761813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7167504223634761813'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/02/jax-rs-in-fuse-esb-4003.html' title='JAX-RS in FUSE ESB 4.0.0.3'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-1047838265017359459</id><published>2009-02-02T13:58:00.000-08:00</published><updated>2009-02-02T14:05:29.852-08:00</updated><title type='text'>Free live online tutorial on FUSE ESB 4!</title><content type='html'>Come see me and my &lt;a href="http://fusesource.com"&gt;fusesource.com&lt;/a&gt; colleague Jack Britton give a live two-hour online tutorial on "getting started with FUSE ESB 4" on February 10th! We'll be covering everything from building the source,  to implementing EIPs, to writing and deploying web-services, to deploying JBI artifacts. There'll be lots of live code, probably a few hiccups, and a whole-lot-of-fun.&lt;br /&gt;&lt;br /&gt;Register &lt;a href="https://progress.webex.com/mw0305l/mywebex/default.do?nomenu=true&amp;amp;siteurl=progress&amp;amp;service=6&amp;amp;main_url=https%3A%2F%2Fprogress.webex.com%2Fec0600l%2Feventcenter%2Fevent%2FeventAction.do%3FtheAction%3Ddetail%26confViewID%3D284600288%26siteurl%3Dprogress%26%26%26"&gt;here&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-1047838265017359459?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/1047838265017359459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=1047838265017359459' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1047838265017359459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1047838265017359459'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/02/free-webinar-on-fuse-esb-4.html' title='Free live online tutorial on FUSE ESB 4!'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5294739184926631145</id><published>2009-01-09T12:01:00.000-08:00</published><updated>2009-01-09T12:01:00.293-08:00</updated><title type='text'>Message Selectors and ActiveMQ</title><content type='html'>Having just completed a consultancy on FUSE Message Broker (Enterprise Apache ActiveMQ), I just thought I'd write some notes about the use of message selectors in JMS, and, in particular, how FUSE Message Broker implements them.&lt;br /&gt;&lt;br /&gt;Message selectors are easy to use, allowing a consumer to specify a filter, using an SQL-like syntax, describing the messages of interest. This filter, example "customerStatus = 'Gold'" instructs the broker to only send messages to the consumer that have a customerStatus header equal to "Gold".&lt;br /&gt;&lt;br /&gt;While message selectors are attractive and conceptually very nice, they do place a burden on the broker: consider the case where you have a large number of consumers, say n, on a queue: for each message the broker must evaluate between 1 and n message selectors before delivering the message. In the case of topic, all n message selectors will have to be evaluated for each message. Ouch: that's a lot of work to be putting on the broker, particularly if you're looking for high-throughput.&lt;br /&gt;&lt;br /&gt;But apart from this, ActiveMQ's memory paging architecture has an optimisation that can flummox you when using message selectors. When messages are sent persistently, ActiveMQ will only page a portion of the messages in memory, but leave the rest on disk. This is very reasonable: however, one side effect of this is that selectors are only evaluated on those messages in memory, not those in the store. So, if your page size is 100, and you have 100 messages for which there is no current matching consumer, you end up with a "hung" queue. For example, consider the case where you have two consumers, selecting on "color = 'red'" and "color = 'blue'" respectively - here, "color" is a custom JMS message header. Let's say that the first (red) consumer is currently not in operation, and we receive 100 messages for red. Blue is waiting, waiting, waiting, but does not get any messages as there are no matching ones present. Now, we get message 101 - a nice blue message. However, our selectors are only matching against the first 100 messages (all red!) so blue still hangs, waiting, despite the fact that there's a perfectly matching message.&lt;br /&gt;&lt;br /&gt;That example is perhaps contrived, but it does demonstrate a potential "hanging consumer" problem. For me though it's a natural side-effect of wanting to limit the broker-side overhead of having to evaluate message selectors. You can of course modify the page size to reduce the chance of the problem happening, but you're just reducing the probability of the lock happening.&lt;br /&gt;&lt;br /&gt;My customer had come up with a conceptually elegant callback design, whereby as messages are forwarded through a server, a consumer is created (for each message) to listen on a queue for a subsequent response, using a unique message identifier within a message selector. While conceptually nice as a design, the overhead (in terms of dynamic consumer creation and message selector processing) just isn't worth it. We proposed an alternative architecture using named queues and a fixed pool of response consumers that's going to work way, way better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5294739184926631145?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5294739184926631145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5294739184926631145' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5294739184926631145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5294739184926631145'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/01/message-selectors-and-activemq.html' title='Message Selectors and ActiveMQ'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-3015107929863062123</id><published>2009-01-08T07:34:00.001-08:00</published><updated>2009-01-08T07:38:17.556-08:00</updated><title type='text'>Looking forward to ApacheCon Europe 2009</title><content type='html'>This year I'm thrilled to be doing a number of talks at ApacheCon Europe 2009, and a full day-long tutorial on building web and REST services with Apache CXF (FUSE Service Framework). Abstracts below - see you there!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Talk: Tales from the Front Line: how ServiceMix, ActiveMQ &amp;amp; CXF are being used to solve real problems.&lt;/span&gt; In this session we discuss how application integration and middleware-focussed Apache projects - like ServiceMix, ActiveMQ, Camel &amp;amp; CXF - are being used to build innovative solutions that add real value to organizations in health-care, government, airline-solutions and finance. For each use-case, we discuss both logical and deployment architecture concerns. We also discuss the motives for adopting open-source in these solutions, and why these Apache projects where chosen above other open source alternatives.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Talk: Adopting Open Source in the Enterprise.&lt;/span&gt;&lt;br /&gt;For some organizations, the decision to adopt open source software&lt;br /&gt;is not taken lightly, and, once made, can require significant shifts&lt;br /&gt;in thinking and organization culture. This session discusses the&lt;br /&gt;issues organizations face when strategically adopting open source,&lt;br /&gt;including how to select open source projects, how to match open source&lt;br /&gt;involvement &amp;amp; contribution with corporate strategy, how to select &amp;amp;&lt;br /&gt;manage professional open source software vendors, what needs to be&lt;br /&gt;done in terms of licensing and legal, and what kind of infrastructure&lt;br /&gt;you need to support your open source strategy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tutorial (full day): Apache CXF - Developing and Deploying Open Source SOA Endpoints&lt;/span&gt;&lt;br /&gt;This one-day tutorial will show how to design, build and deploy RESTful and Web-based web services using Apache CXF. The session will cover code-first and WSDL first services design for JAX-WS, and show how to use JAX-RS for restful services. We'll show how to swap different transports (HTTP, JMS) with different payload types (XML, SOAP, JSON). And, we'll show how CXF's support for JavaScript can be used to create client- and serverside components for AJAX applications. This workshop will combine a mix of lectures, whiteboarding, and hands-on exercise sessions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-3015107929863062123?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/3015107929863062123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=3015107929863062123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3015107929863062123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3015107929863062123'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2009/01/looking-forward-to-apachecon-europe.html' title='Looking forward to ApacheCon Europe 2009'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-1912503198760748982</id><published>2008-12-18T05:00:00.000-08:00</published><updated>2008-12-18T12:12:18.030-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='servicemix osgi oracle jdbc pool'/><title type='text'>Sharing an Oracle JDBC pool in SMX4</title><content type='html'>In a previous post, I talked about how to share a JDBC pool using ServiceMix4; in that example, I used a Postgres connection pool. I wanted to the same with Oracle as the base driver and the &lt;code&gt;commons-dbcp&lt;/code&gt; pooling library and went on my merry way. But then, disaster struck: I got a dreaded ClassNotFound exception. "Can this be?" I thought... isn't OSGi supposed to shield me from class-loading hell and put some colour back into my graying hair?&lt;br /&gt;&lt;br /&gt;Delving in, I figured out what the issue was, and, I'm glad to say, the ServiceMix OSGi kernel was behaving exactly as it should. I had wrapped the commons-dbcp JAR without much thought: it turns out that code in the commons &lt;code&gt;org.apache.commons.dbcp.BasicDataSource&lt;/code&gt; class (see below) is doing a Class.forName() call to load the &lt;code&gt;oracle.jdbc.driver.OracleDriver&lt;/code&gt; class.&lt;br /&gt;&lt;br /&gt;   &amp;lt;bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&amp;gt;&lt;br /&gt;     &amp;lt;property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/&amp;gt;&lt;br /&gt;     &amp;lt;property name="url" value="jdbc:oracle:thin:@localhost:1521:BLAH"/&amp;gt;&lt;br /&gt;     &amp;lt;property name="username" value="blah"/&amp;gt;&lt;br /&gt;     &amp;lt;property name="password" value="blah"/&amp;gt;&lt;br /&gt;     &amp;lt;property name="maxActive" value="10"/&amp;gt;&lt;br /&gt;     &amp;lt;property name="poolPreparedStatements" value="true"/&amp;gt;&lt;br /&gt;   &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;Now, OSGi bundles have to specify the packages they import using the &lt;code&gt;Import-Package&lt;/code&gt; tag. That's all well and good if you know what these packages are in advance. Poor &lt;code&gt;commons-dbcp&lt;/code&gt; can't know in advance what kind of driver it should load, so &lt;code&gt;Import-Package&lt;/code&gt; just doesn't work here. Instead, you've got to allow the &lt;code&gt;commons-dbcp&lt;/code&gt; bundle to import anything: you can do this using the &lt;code&gt;DynamicImport-Package&lt;/code&gt; tag, setting it to &lt;code&gt;DynamicImport-Package: *&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;We're currently patching the &lt;code&gt;commons-dbcp&lt;/code&gt; bundle on the ServiceMix &lt;a href="http://servicemix.apache.org/SMX4/bundles-repository.html"&gt;bundle repository&lt;/a&gt; so that it includes the &lt;code&gt;DynamicImport-Package: *&lt;/code&gt; tag by default.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-1912503198760748982?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/1912503198760748982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=1912503198760748982' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1912503198760748982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1912503198760748982'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/12/sharing-oracle-jdbc-pool-in-smx4.html' title='Sharing an Oracle JDBC pool in SMX4'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5767362139570040281</id><published>2008-12-17T13:25:00.001-08:00</published><updated>2008-12-17T14:13:25.982-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='servicemix osgi postgresql jdbc pool'/><title type='text'>How to share a single JDBC Pool across SMX4 bundles</title><content type='html'>In the last week I have been working on a solution involving a number of Camel routes deployed into FUSE ESB 4 (ServiceMix4). The new OSGi archetypes for ServiceMix4 (&lt;code&gt;servicemix-osgi-camel-archetype&lt;/code&gt;, &lt;code&gt;servicemix-osgi-cxf-code-first-archetype&lt;/code&gt; and &lt;code&gt;servicemix-osgi-cxf-wsdl-first-archetype&lt;/code&gt;) are really handy in that regard - nice work &lt;a href="http://opensourceknowledge.blogspot.com"&gt;Ashwin Karpe&lt;/a&gt;! Those new archetypes have been checked in to SVN, but may not be in the release build yet so if you want them you may need to check them out and build them locally.&lt;br /&gt;&lt;br /&gt;Because SMX4 is built on OSGi, you can deploy any Java artifact, not just JBI components. I put this to the test: my customer wanted to have a single, shared JDBC pool across all of his bundles. You can do this by creating the pool in a simple Spring file, and registering it as a service for all the other bundles to use. To do this, I installed the driver for PostgreSQL into my SMX container, using the nifty "wrap:" feature that will take a jar and osgi-ify it. Then, I created a Spring context file to intantiate the bean, like this: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;bean id="postgresPoolingDS" class="org.postgresql.ds.PGPoolingDataSource"&amp;gt;&lt;br /&gt;      &amp;lt;property name="serverName" value="localhost"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="databaseName" value="play"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="portNumber" value="0"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="user" value="play"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="password" value="pa55w0rd"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="dataSourceName" value="postgres"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="initialConnections" value="1"/&amp;gt;&lt;br /&gt;      &amp;lt;property name="maxConnections" value="100"/&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;osgi:service id="postgresPoolingDSService" ref="postgresPoolingDS" &lt;br /&gt;      auto-export="all-classes"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here's the really neat bit: when you drop this spring file into the &lt;code&gt;deploy&lt;/code&gt; directory of ServiceMix 4, the ServiceMix kernel will osgi-ify the file and deploy it as a bundle. Hey-presto: the pool is created and registered as a service in the OSGi service registry. &lt;br /&gt;&lt;br /&gt;To access this service from one of my camel routes, I used the &lt;code&gt;&amp;lt;osgi:reference&amp;gt;&lt;/code&gt; to get a reference to the dataSource in my bundle's spring file. You can then inject the reference into your route and away you go. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;osgi:reference id="dataSource" interface="javax.sql.DataSource" /&amp;gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;The "look-up" is done by interface type: in this case I'm OK as there's only one &lt;code&gt;javax.sql.DataSource&lt;/code&gt; registered. I should really do a more explicit query, but I guess I'll leave that as an exercise for the interested reader.&lt;br /&gt;&lt;br /&gt;For me, this kind of thing is OSGi at its best: allowing sharing and reuse of Java classes &lt;em&gt;and&lt;/em&gt; Java objects in a really nice, modular way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5767362139570040281?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5767362139570040281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5767362139570040281' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5767362139570040281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5767362139570040281'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/12/how-to-share-single-jdbc-pool-across.html' title='How to share a single JDBC Pool across SMX4 bundles'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-412122587811444120</id><published>2008-12-01T11:55:00.000-08:00</published><updated>2008-12-01T11:57:47.661-08:00</updated><title type='text'>Take care when propagating transport headers through Camel!</title><content type='html'>Last week I worked with a fellow FUSE enthusiast on a very cool proof-of-concept showing how to route XML messages containing partially encrypted message payload. We used FUSE Services Framework (Apache CXF) to create a SOAP service and consumer, and used the nifty WSS4J interceptors (thanks to Glen Mazza's excellent &lt;a href="http://www.jroller.com/gmazza/date/20080729"&gt;blog entry&lt;/a&gt; on the subject) to encrypt selected elements of the SOAP message. CXF is such a great project - we got our service running really quickly without any trouble at all. &lt;br /&gt;&lt;br /&gt;Feeling boisterous and buoyant with the taste of success, we forged ahead to put an intermediary Camel route between the service and the consumer, to do some content-based routing based on the non-encrypted part of the payload. This kind of X-Path routing is really easy to do with FUSE Medation Router (Apache Camel). Thinking that our coffee break was only minutes away we ran a quick test only to witness an exception on the SOAP consumer, deep in some HTTP-commons code: "bad chunk charachter '60'". Very strange, we thought: we knew that the unencrypted version worked fine. And, we know that it worked fine when the consumer talked directly with the service. &lt;br /&gt;&lt;br /&gt;We investigated. A cursory look at the ASCII table shows that '60' is the code for '&lt;'. Hmmm. Instantly this stank of something going on with the XML payload. But what? Our hopes for fresh coffee were now overrun by a burning desire to figure this out. We looked at all the angles, and eventually after an hour or so of scatching our heads, saw the light. The CXF consumer (the client!) was transmitting the payload using HTTP chunking: this has two effects at a payload level. First, a transport attribute, Transfer-Encoding, is set as "chunked"; second, the payload is then transmitted "chunked" by breaking it up into smaller chunks and transmitting each chunk preceded with a line containing a number indicating the size of the chunk. &lt;br /&gt;&lt;br /&gt;CXF provides support for chunking, as do the Camel HTTP and Jetty components; so, the problem was not the chunking &lt;em&gt;per se&lt;/em&gt;. Here's what was going on: the Camel route was receiving the payload and reassembling (or "unchunking") the content; however, our route was passing on the Transfer-Encoding header intact. So, when the payload arrived at the target service, the payload was unchunked, but the header suggested the opposite. The server read the first line of the payload to get the chunk size, got a '&lt;', and correctly argued that this is an invalid character to describe the chunk size. &lt;br /&gt;&lt;br /&gt;We disabled chunking on the client side in CXF, and then everything worked fine - effectively this just removes the problem by cutting it off at source. In general though, I think it raises a word of caution: be mindful of the headers you propagate through integration flows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-412122587811444120?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/412122587811444120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=412122587811444120' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/412122587811444120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/412122587811444120'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/12/take-care-when-propagating-transport.html' title='Take care when propagating transport headers through Camel!'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5363661574251041220</id><published>2008-11-10T06:21:00.000-08:00</published><updated>2008-11-10T23:18:24.802-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source unique selling point professional services'/><title type='text'>Does Unique Selling Point have any meaning in for Open Source professional services firms?</title><content type='html'>On my way home back from a gig in Kiev last week, I read a truly enlightening, fun and excellent white paper from the smart folk of &lt;a href="http://www.whillsgroup.com"&gt;Wellesley Hills Group&lt;/a&gt;, posted at &lt;a href="www.quickarrow.com"&gt;QuickArrow&lt;/a&gt;. The paper - or rather, collection of articles - entitled "Truth and Lies in Professional Services Marketing", argues that the dynamics of services business are different from those of a product business: consequently, the rules and mantra's of marketing need to be tweaked (or thrown out) when applied to professional services businesses.&lt;br /&gt;&lt;br /&gt;I was particularly interested in because, in the last year, I have studied a Diploma in Business Development at the &lt;a href="www.imi.ie"&gt;Irish Management Institute&lt;/a&gt;; I graduate next week (with distinction: hurrah!). The Dip Bus. Dev. is a great program, particularly for myself as a person of technical origin. Regularly I would meet with my assigned business mentor, who would administer a ritual and deserved mental beating as she questioned everything I had ever held dear. One of the most difficult things for me on this course was to let go of my need for scientific, clear reasoning, and embrace fuzzier, more intuitive business concepts. &lt;br /&gt;&lt;br /&gt;But back to that paper! Let's say you're running a professional services firm that specializes in open source. What can you say is your Unique Selling Point? Hmmm. That you know the source? Everyone knows the source dude, that's the whole point! That you have committers on your team? Better... however, anyone with smarts can become a committer in an open an vibrant community, so if this is your USP and your open source projects are successful, then your competitors will quickly become committers: there goes your USP, gently flying out the window. The open nature of open source means that the barriers to entry are low; sure, becoming an expert on an open-source project takes time, but anyone with smarts and the willingness to invest the time can eventually break into your space. Back to the USP: you could talk about experience, customer-focus, reliability, ... but then, so will all your competitors, so they're not good unique selling point candidates either. &lt;br /&gt;&lt;br /&gt;So: forget about "uniqueness" for now. The nature of open source services is that, if your project is successful, then your firm will become one of many others - an ecosystem, if you will - offering similar services around the code. Being a PS firm in open source is very much like being a law firm, or a chartered accountancy firm, or a doctor: all rely on an open body of knowledge at which they have become experts, and they sell that expertise for a price. It's not about "uniqueness": when you want a lawyer, accountant or doctor you do not care if they're unique or different: you care that you can trust these guys to solve your problem and make things right. A strong reputation, with credible proof of their expertise, is more important than a unique selling point. &lt;br /&gt;&lt;br /&gt;Successfully marketing your services, then, is not about USPs; it's about having a genuine, credible, reputation. So how can you build this? By taking part in the community. By contributing fixes, patches, and documentation. By helping newbie users into the community. By speaking, writing and blogging about the knowledge for which you are expert, at community events (with your peers) and at industry events. By being clear about how you your services can help others, who don't have your level of experience or expertise. By being reliably, trustworthy, and professional with your customers - so that they're happy to endorse you.&lt;br /&gt;&lt;br /&gt;Perhaps, it can be argued, this "reputation" becomes your unique selling point. However, it's a reputation built on real evidence, not on slick marketing material or finely-tuned elevator pitches. &lt;br /&gt;&lt;br /&gt;Give that paper a read - it's well worth it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5363661574251041220?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5363661574251041220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5363661574251041220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5363661574251041220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5363661574251041220'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/11/does-unique-selling-point-have-any.html' title='Does Unique Selling Point have any meaning in for Open Source professional services firms?'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-441735112273455110</id><published>2008-11-05T14:09:00.000-08:00</published><updated>2008-11-06T12:38:43.759-08:00</updated><title type='text'>Explicitly creating dead letter queues in ActiveMQ using individualDeadLetterStrategy</title><content type='html'>There are lots of great features in ActiveMQ that are documented only in the code, which is a shame, as it means that it sometimes means developers are "six degrees of google searchin'" away from finding out how to enable the feature. &lt;br /&gt;&lt;br /&gt;I came across this one while working for a customer: they're happy with the concept of the default dead letter queue in ActiveMQ, but need to know how configure an individual DLQ for each of their queues. The answer is to configure an 'individualDeadLetterStrategy', and I've updated the ActiveMQ wiki pages to show how to configure this. This change should make it's way through to the &lt;a href="http://activemq.apache.org/message-redelivery-and-dlq-handling.html"&gt;Apache ActiveMQ web site&lt;/a&gt; overnight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-441735112273455110?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/441735112273455110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=441735112273455110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/441735112273455110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/441735112273455110'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/11/explicitly-creating-dead-letter-queues.html' title='Explicitly creating dead letter queues in ActiveMQ using individualDeadLetterStrategy'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-7817925462280303906</id><published>2008-11-03T10:09:00.001-08:00</published><updated>2008-11-03T10:09:49.131-08:00</updated><title type='text'>JMS/JCA Flows in ServiceMix: the wrong level of abstraction for distributed ESB</title><content type='html'>The ongoing argument over &lt;a href="http://www.davidgreco.it/MySite/Blog/Entries/2008/10/6_RPC_vs_Rest%3A_a_quick_thought.html"&gt;REST versus RPC&lt;/a&gt; has created useful debate around programming abstractions, particularly with respect to the use of abstractions in distributed computing. Abstractions are useful in that they remove underlying complexities and allow us to focus on the task at hand. However astractions fail if they hide away important detail that could influence design or implementation decisions. For example, the problem with RPC, some RESTful folks would argue, is that in making remote invocations look like local invocations, RPC facilitates poor design decisions that neglect caching, error handling, or optimization of network traffic. And, they may have a good point here; however, in this blog entry I don't wish to go down the well-beaten REST/RPC track, instead though I want to discuss the use of a particular abstraction in implementing integration solutions with FUSE ESB (Enterprise Apache ServiceMix). I've found that while this abstraction - the JMS/JCA flows - offers exciting possibilities, it is the wrong abstraction, and should be avoided.&lt;br /&gt;&lt;br /&gt;I had been pondering for some time about the use of abstractions within the ServiceMix implementation of the JBI Normalized Message Router (NMR). The NMR is used to send messages from one component to another; in ServiceMix, this is implemented using a number of different "flows". Depending on the kind of message exchange (syncronous or asynchronous), quality of service (reliable, transacted), and whether the target service is clustered, the NMR will choose a "flow" to match. &lt;br /&gt;&lt;br /&gt;Four flows are provided in ServiceMix - single-threaded (ST) , SEDA, JMS &amp; JCA. Of these, the latter two have interesting and exotic qualities. First, because they're both based on JMS, they are reliable: messages can be persisted as they travel between components. Second, and again, because they are implemented using ActiveMQ JMS queues, this means that if the ServiceMix container is deployed in a cluster, then messages can transparently be delivered across JVM containers. This gives us a truly "distributed ESB".&lt;br /&gt;&lt;br /&gt;Many are drawn to this visionary usage of the NMR; however, I strongly believe that clustering &amp; persistence of the NMR is &lt;em&gt;the wrong level of abstraction&lt;/em&gt;. First, you are unwittingly exposing your solution to potentially unacceptable performance hit. With a little knowledge of the NMR's message passing semantics, you'll see that even a simple integration solution  (like my File -&gt; Pipeline EIP -&gt; transfomer -&gt; JMS) takes more NMR messages than you think: in this case, seven messages are used. Wow, a simple little integration solution using the JMS-flow takes a total of three persisted JMS queues and four temporary queues! And each of those persistant queues, in ActiveMQ, will need it's own thread! In fact, if you've left the default flow settings enabled in ServiceMix, you'll see that we create &lt;em&gt;two&lt;/em&gt; queues (and hence, &lt;em&gt;two&lt;/em&gt; threads) for each service on the NMR (one for JMS-flow, and another for JCA-flow!). I was curious about the impact of these flows on ServiceMix threading, so played around with the configuration. I found that by simply disabling the JMS &amp; JCA flows in ServiceMix3, I was able to reduce the number of threads on startup by about 50%. Yup, that's right. I halved the number of threads lurking in the JVM.&lt;br /&gt;&lt;br /&gt;So, a deeper look shows that this "flow" abstraction is going to consume resources and impact on your latency &amp; throughput. It gets even hairier though: with a flow like the one I detailed above, it's possible that in a clustered environment your message exchange could start out on the file component of  machine &lt;em&gt;A&lt;/em&gt;, get pipelined by machine &lt;em&gt;B&lt;/em&gt;, get transformed back in machine &lt;em&gt;A&lt;/em&gt;, and then get send to the JMS provider on machine &lt;em&gt;B&lt;/em&gt;. All that remote network traffic when all I ever wanted was to do a little transformation on a file and drop it into a queue.&lt;br /&gt;&lt;br /&gt;I had the good fortune to be in town with &lt;a href="http://gnodet.blogspot.com/"&gt;Guillaume Nodet&lt;/a&gt;, Godfather of Servicemix, last week, and talked to him about this; Guillaume is an intelligent and fun guy and if you get a chance to meet him then take it! It turns out that the JMS/JCA flow feature of ServiceMix was there before the NMR was refactored to become JBI-compliant. So, back when it was invented, it wasn't burdened by the additional NMR traffic mandated by the JBI spec. So, these flows made more sense back then, but really don't make so much sense now. You can get everything you want in terms of reliability by using explicit queues as checkpoints in a transactional SEDA architecture: just use the SEDA flow, and, where transaction propagation is required, set the message exchange to be synchronous.&lt;br /&gt;&lt;br /&gt;Rather than engage in feature debridement in ServiceMix3, Guillaume has made the right move in choosing to leave these flows in ServiceMix3 but omit them from ServiceMix4. There is talk about reimplementing the JMS flow for ServiceMix4 for "backwards compatability", but I for one would rather see Guillaume invest his and the community's efforts on other more pressing stuff. A really nice feature of ServiceMix4 is that you will be able to transactional propagation on the SEDA flow with asynchronous as well as synchronous messages, so those who invest in the SEDA appraoch now can avail of better thread-performance at the flick of a switch when they move to ServiceMix4.&lt;br /&gt;&lt;br /&gt;Both Guillaume and I were agreed in that if you want to introduce clustering, reliability or transactionality into your integration solution, then do so using explicitly named JMS queues. That way, you have full control over when and where your message exchanges are persisted, transacted or clustered. It's easy, &lt;em&gt;and&lt;/em&gt; more importantly, it's the Right Level of Abstraction for integration solutions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-7817925462280303906?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/7817925462280303906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=7817925462280303906' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7817925462280303906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7817925462280303906'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/11/jmsjca-flows-in-servicemix-wrong-level.html' title='JMS/JCA Flows in ServiceMix: the wrong level of abstraction for distributed ESB'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-8319352453449404835</id><published>2008-10-24T13:00:00.000-07:00</published><updated>2008-10-24T13:13:23.398-07:00</updated><title type='text'>AMQP back in the radar...</title><content type='html'>Just learned that  &lt;a href="http://biz.yahoo.com/prnews/081024/aqf515.html?.v=23"&gt;Microsoft has joined up with AMQP&lt;/a&gt;. This is great news - I was &lt;a href="http://blogs.iona.com/sos/2007/03/qcon_london_celtix_enterprise_1.html"&gt;playing with AMQP&lt;/a&gt; some time ago but in recent months I got a feeling that there was a lot of sitting on the fence about whether people are going to take up on it or not. There's nothing so sad as taking a great idea with a well thought out standard and seeing it get a lack-lustre take-up. This is just the kind of injection AMQP needed. &lt;br /&gt;&lt;br /&gt;As I recall, Apache Camel already has support for AMQP, so that'll be a very nice bridging tool for organizations who want to migrate piecemeal towards an AMQP-based infrastructure. &lt;br /&gt;&lt;br /&gt;It'll be nice to see what the full extend of Microsoft's participation will be: are they going to buy in wholesale or are they going to just look nice in the background of wedding photographs, enjoying the party? Will they be actively implementing AMQP brokers, or will they just add some AMQP connectivity options to their existing integration offerings? &lt;br /&gt;&lt;br /&gt;Things are getting interesting again for AMQP :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-8319352453449404835?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/8319352453449404835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=8319352453449404835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/8319352453449404835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/8319352453449404835'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/10/amqp-back-in-radar.html' title='AMQP back in the radar...'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-7089395921957251580</id><published>2008-10-22T23:40:00.000-07:00</published><updated>2008-10-22T23:58:34.643-07:00</updated><title type='text'>Sneak Preview: my FUSE ESB / ServiceMix screencasts...</title><content type='html'>Over the last few weeks I've worked on putting some screen casts together on how to get "over the hump" with ServiceMix: you've read all about it, you've downloaded it, and then you wonder: where do I start?&lt;br /&gt;&lt;br /&gt;In the screen casts, I show: &lt;br /&gt;&lt;br /&gt;&lt;li&gt;Three things to make you more productive with ServceMix - see how to set up your development environment to get stuff done faster.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to create a simple flow - from file pickup to JMS queue.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to XSLT transform file data and place on a JMS queue using a pipeline EIP.&lt;/li&gt; &lt;br /&gt;&lt;br /&gt;The screencasts aren't long, 8, 25 &amp; 19 minutes respectively. Use the streamed video below to get an idea of what's going on in the screen casts: if you like them, then let me know and I'll send an FTP link to where you can download the full resolution 800x600 quick-time movies.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Three things to make you more productive with ServceMix&lt;/h3&gt; &lt;br /&gt;&lt;br /&gt;&lt;object id="objf181d56ee25b9bcb59c41ffff2deb27e" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="450" height="418"&gt;&lt;param name="movie" value="http://cdn1.fliqz.com/fliqz/production/components/07842d0940b84b6f898b6d8d5da77f3e.swf" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent" /&gt; &lt;param name="AllowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="file=f181d56ee25b9bcb59c41ffff2deb27e&amp;" /&gt;&lt;embed id="embf181d56ee25b9bcb59c41ffff2deb27e" src="http://cdn1.fliqz.com/fliqz/production/components/07842d0940b84b6f898b6d8d5da77f3e.swf" width="450" height="418" allowFullScreen="true" wmode="transparent" AllowScriptAccess="always" flashvars="file=f181d56ee25b9bcb59c41ffff2deb27e&amp;" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" &gt;&lt;/embed&gt;&lt;/object&gt;  &lt;script type="text/javascript"&gt; if(document.getElementById("objf181d56ee25b9bcb59c41ffff2deb27e"))     document.getElementById("objf181d56ee25b9bcb59c41ffff2deb27e").setAttribute("FlashVars", "file=f181d56ee25b9bcb59c41ffff2deb27e&amp;permalink="+encodeURIComponent(location.href));  if(document.getElementById("embf181d56ee25b9bcb59c41ffff2deb27e"))     document.getElementById("embf181d56ee25b9bcb59c41ffff2deb27e").setAttribute("FlashVars", "file=f181d56ee25b9bcb59c41ffff2deb27e&amp;permalink="+encodeURIComponent(location.href)); &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How to create a simple flow - from file pickup to JMS queue&lt;/h3&gt;&lt;br /&gt;&lt;object id="objfcee8f46232da27e409820531eb89803" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="450" height="418"&gt;&lt;param name="movie" value="http://cdn1.fliqz.com/fliqz/production/components/07842d0940b84b6f898b6d8d5da77f3e.swf" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent" /&gt; &lt;param name="AllowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="file=fcee8f46232da27e409820531eb89803&amp;" /&gt;&lt;embed id="embfcee8f46232da27e409820531eb89803" src="http://cdn1.fliqz.com/fliqz/production/components/07842d0940b84b6f898b6d8d5da77f3e.swf" width="450" height="418" allowFullScreen="true" wmode="transparent" AllowScriptAccess="always" flashvars="file=fcee8f46232da27e409820531eb89803&amp;" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" &gt;&lt;/embed&gt;&lt;/object&gt;  &lt;script type="text/javascript"&gt; if(document.getElementById("objfcee8f46232da27e409820531eb89803"))     document.getElementById("objfcee8f46232da27e409820531eb89803").setAttribute("FlashVars", "file=fcee8f46232da27e409820531eb89803&amp;permalink="+encodeURIComponent(location.href));  if(document.getElementById("embfcee8f46232da27e409820531eb89803"))     document.getElementById("embfcee8f46232da27e409820531eb89803").setAttribute("FlashVars", "file=fcee8f46232da27e409820531eb89803&amp;permalink="+encodeURIComponent(location.href)); &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;How to XSLT transform file data and place on a JMS queue using a pipeline EIP&lt;/h3&gt;&lt;br /&gt; &lt;br /&gt;&lt;object id="objc5d8c9aa44fd999a628f2085d877e553" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="450" height="418"&gt;&lt;param name="movie" value="http://cdn1.fliqz.com/fliqz/production/components/07842d0940b84b6f898b6d8d5da77f3e.swf" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent" /&gt; &lt;param name="AllowScriptAccess" value="always" /&gt;&lt;param name="flashvars" value="file=c5d8c9aa44fd999a628f2085d877e553&amp;" /&gt;&lt;embed id="embc5d8c9aa44fd999a628f2085d877e553" src="http://cdn1.fliqz.com/fliqz/production/components/07842d0940b84b6f898b6d8d5da77f3e.swf" width="450" height="418" allowFullScreen="true" wmode="transparent" AllowScriptAccess="always" flashvars="file=c5d8c9aa44fd999a628f2085d877e553&amp;" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" &gt;&lt;/embed&gt;&lt;/object&gt;  &lt;script type="text/javascript"&gt; if(document.getElementById("objc5d8c9aa44fd999a628f2085d877e553"))     document.getElementById("objc5d8c9aa44fd999a628f2085d877e553").setAttribute("FlashVars", "file=c5d8c9aa44fd999a628f2085d877e553&amp;permalink="+encodeURIComponent(location.href));  if(document.getElementById("embc5d8c9aa44fd999a628f2085d877e553"))     document.getElementById("embc5d8c9aa44fd999a628f2085d877e553").setAttribute("FlashVars", "file=c5d8c9aa44fd999a628f2085d877e553&amp;permalink="+encodeURIComponent(location.href)); &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-7089395921957251580?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/7089395921957251580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=7089395921957251580' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7089395921957251580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7089395921957251580'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/10/sneak-preview-my-fuse-esb-servicemix.html' title='Sneak Preview: my FUSE ESB / ServiceMix screencasts...'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-6305009124036343504</id><published>2008-10-22T10:25:00.000-07:00</published><updated>2008-10-22T10:29:40.369-07:00</updated><title type='text'>FUSE TV: Andy Warhol may have been right...</title><content type='html'>Didn't Warhol say something about in the future everyone will have 15 minutes of fame? I, along with some of my Progress colleagues, have been recorded for &lt;a href="&lt;br /&gt;http://fusesource.com/resources/video-archived-webinars/"&gt;FUSE TV&lt;/a&gt;. My own slot is 13m 13s, which means that I may have only 1m 47s left. Hmmmm... better use those precious seconds sparingly...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-6305009124036343504?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/6305009124036343504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=6305009124036343504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6305009124036343504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/6305009124036343504'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/10/fuse-tv-andy-warhol-may-have-been-right.html' title='FUSE TV: Andy Warhol may have been right...'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-4923167648768873249</id><published>2008-10-08T13:31:00.001-07:00</published><updated>2008-10-08T14:01:40.679-07:00</updated><title type='text'>m2eclipse: developing with ServiceMix / FUSE archetypes has never been so easy</title><content type='html'>Hurrah for Cool Tooling!&lt;br /&gt;&lt;br /&gt;Maven archetypes are great: anyone developing with ServiceMix will know and appreciate good archetypes, but will probably grumble disapprovingly at the long command lines they entail. In ServiceMix, the &lt;code&gt;smx-arch&lt;/code&gt; command-line short-cut made things easier, but I was always uncomfortable with having to swich from Eclipse to the command-line to create my new projects.&lt;br /&gt;&lt;br /&gt;In the last few days, Guillaume Nodet put in a tiny little script onto the FUSE repository (http://repo.open.iona.com/maven2) that generates an &lt;code&gt;archetypes-catalog.xml&lt;/code&gt; file containing all the archetypes. You can import this URL into m2eclipse, and then use the really neat m2eclipse dialogs to create your maven/eclipse projects directly from the catalog.&lt;br /&gt;&lt;br /&gt;I love it so much I added an entry on the &lt;a href="http://open.iona.com/wiki/display/ProdInfo/Using+FUSE+archetypes+with+m2eclipse"&gt;FUSE wiki&lt;/a&gt;; go there for more details!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-4923167648768873249?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/4923167648768873249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=4923167648768873249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/4923167648768873249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/4923167648768873249'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/10/m2eclipse-developing-with-servicemix.html' title='m2eclipse: developing with ServiceMix / FUSE archetypes has never been so easy'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-2801916172014143562</id><published>2008-10-06T13:24:00.000-07:00</published><updated>2008-10-06T13:37:21.148-07:00</updated><title type='text'>Carpe springem - community to the rescue?</title><content type='html'>I was following a trail on the CXF users list, when Dan Kulp introduced "FreeSpring" (http://www.freespring.org), a community-based effort that has come about to alleviate the effects of the new SpringSource licensing system. Their aim is to solve three key problems for Spring users who do not want to pay SpringSource subscriptions for fixes &lt;em&gt;after&lt;/em&gt; the three-month post-release dust-settling period: creating versioned binary distributions, applying community fixes, and, importantly, providing distributions through maven.&lt;br /&gt;&lt;br /&gt;I admire the initiative, but was of course keen to find out how freespring.org plan to keep the lights on... their intent is to get some corporate backing from benevolent organisations (perhaps SpringSource competitors?) and also to sell advertising space. I think the latter may be a go-er: freespring.org has the opportunity to become a hub for open-minded Java developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-2801916172014143562?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/2801916172014143562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=2801916172014143562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2801916172014143562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2801916172014143562'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/10/carpe-springem-community-to-rescue.html' title='Carpe springem - community to the rescue?'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-1151671099326093338</id><published>2008-09-25T09:12:00.000-07:00</published><updated>2008-09-25T09:35:14.532-07:00</updated><title type='text'>Using AspectJ to diagnose ServiceMix component performance</title><content type='html'>An inventive FUSE customer showed me an approach to diagnosing his ServiceMix integration flow by injecting some aspect-oriented code, and it's so cool that I thought it would be worth sharing. The problem is this: given that you have an integration flow, how can you diagnose how long each endpoint in the flow is taking to do its business? The customer in particular was experiencing exceptionally high latency on his integration flow (in the order of 900ms) that just seemed plain wrong: the question was, where in the flow was he incurring the hit? Was it in transformation, EIP, resequencing, or something else?&lt;br /&gt;&lt;br /&gt;I used AspectJ to reproduce my customer's approach, weaving in some diagnosis code into the ServiceMix call stack. You can do this by creating a simple aspect like the one below, which is called whenever a call is made to &lt;span style="font-family:courier new;"&gt;Flow.send()&lt;/span&gt;. The &lt;span style="font-family:courier new;"&gt;measurePeformance()&lt;/span&gt; method does some logging, but also does a simple timer around the message invocation. The result will only be accurate to the millisecond; however, if you're trying to isolate big-elephant-in-the-room bottlenecks then this should be sufficient.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@Aspect&lt;br /&gt;public class PerformanceAdvice {&lt;br /&gt;&lt;br /&gt;   @Around("execution(* org.apache.servicemix.jbi.nmr.flow.Flow.send(..))")&lt;br /&gt;   public Object measurePerformance(ProceedingJoinPoint thisJoinPoint) {  &lt;br /&gt;       Object ret = null;&lt;br /&gt;       try {&lt;br /&gt;           MessageExchange me = (MessageExchange) thisJoinPoint.getArgs()[0];&lt;br /&gt;               System.out.println("send() to " + me.getEndpoint().getServiceName() + "... (status: " + me.getStatus() + ", role: "&lt;br /&gt;                       + (me.getRole() == MessageExchange.Role.PROVIDER ? "PROVIDER" : "CONSUMER")&lt;br /&gt;                       + ")");&lt;br /&gt;               long startTime = System.currentTimeMillis();&lt;br /&gt;                ret = thisJoinPoint.proceed();&lt;br /&gt;               long endTime = System.currentTimeMillis();&lt;br /&gt;               System.out.println(me.getEndpoint().getServiceName() + " done; elapsed time = " + (endTime - startTime) + " ms.");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       } catch (Throwable e) {&lt;br /&gt;           System.out.println(e.getMessage());&lt;br /&gt;       }&lt;br /&gt;       return ret;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To weave this code into ServiceMix (I used version &lt;span style="font-family:courier new;"&gt;3.3.1.6-fuse&lt;/span&gt; from &lt;span style="font-family:courier new;"&gt;http://open.iona.com&lt;/span&gt;) was surprising easily: I added the JARs for aspectj (&lt;span style="font-family:courier new;"&gt;aspectjlib.jar&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;aspectjtools.jar&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;aspectjrt.jar&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;aspectjweaver.jar&lt;/span&gt;) into ServiceMix's &lt;span style="font-family:courier new;"&gt;lib&lt;/span&gt; directory. I also jarred up my &lt;span style="font-family:courier new;"&gt;PerformanceAdvice&lt;/span&gt; class and dropped it into the &lt;span style="font-family:courier new;"&gt;lib&lt;/span&gt; directory too. Finally, I modified the ServiceMix configuration file - &lt;span style="font-family:courier new;"&gt;conf/servicemix.xml&lt;/span&gt; - to create my advice and turn on auto-proxying for AspectJ. First, I added the Spring AOP namespace to the &lt;span style="font-family:courier new;"&gt;&lt;beans&gt;&lt;/beans&gt;&lt;/span&gt; tag:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    xmlns:aop="http://www.springframework.org/schema/aop"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then, I added the following elements within the &lt;span style="font-family:courier new;"&gt;&lt;beans&gt;&lt;/beans&gt;&lt;/span&gt; element:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;!-- Turn on AspectJ auto-proxying --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;aop:aspectj-autoproxy/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;!-- Create my performance advice aspect --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;bean id="performanceAdvice" class="ps.progress.com.PerformanceAdvice"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And that's it! To test, I ran a simple integration flow that reads from a JMS queue and uses a pipeline to transform the message and send the result to another queue. Here's the output:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; Invoking on {http://progress.com/ps/smx/demo/transformer}Pipeline... (status: Active, role: PROVIDER)&lt;br /&gt; {http://progress.com/ps/smx/demo/transformer}Pipeline done; elapsed time = 0 ms.&lt;br /&gt; Invoking on {http://progress.com/ps/smx/demo/transformer}XsltTransformer... (status: Active, role: PROVIDER)&lt;br /&gt; {http://progress.com/ps/smx/demo/transformer}XsltTransformer done; elapsed time = 1 ms.&lt;br /&gt; Invoking on {http://progress.com/ps/smx/demo/transformer}XsltTransformer... (status: Active, role: CONSUMER)&lt;br /&gt; {http://progress.com/ps/smx/demo/transformer}XsltTransformer done; elapsed time = 0 ms.&lt;br /&gt; Invoking on {http://progress.com/ps/smx/demo/transformer}JmsOutput... (status: Active, role: PROVIDER)&lt;br /&gt; {http://progress.com/ps/smx/demo/transformer}JmsOutput done; elapsed time = 0 ms.&lt;br /&gt; Invoking on {http://progress.com/ps/smx/demo/transformer}JmsOutput... (status: Done, role: CONSUMER)&lt;br /&gt; {http://progress.com/ps/smx/demo/transformer}JmsOutput done; elapsed time = 1 ms.&lt;br /&gt; Invoking on {http://progress.com/ps/smx/demo/transformer}XsltTransformer... (status: Done, role: PROVIDER)&lt;br /&gt; {http://progress.com/ps/smx/demo/transformer}XsltTransformer done; elapsed time = 0 ms.&lt;br /&gt; Invoking on {http://progress.com/ps/smx/demo/transformer}Pipeline... (status: Done, role: CONSUMER)&lt;br /&gt; {http://progress.com/ps/smx/demo/transformer}Pipeline done; elapsed time = 1 ms.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can see that there's lots of messages being sent out - we're most interested in those where the status is &lt;span style="font-family:courier new;"&gt;Active&lt;/span&gt; and the role is &lt;span style="font-family:courier new;"&gt;PROVIDER&lt;/span&gt; (you can modify the &lt;span style="font-family:courier new;"&gt;PerformanceAdvice&lt;/span&gt; class to just print those out if you like). From this, I can see that the call to the &lt;span style="font-family:courier new;"&gt;XsltTransformer&lt;/span&gt; endpoint is taking just 1ms; a nice verification that my XSLT transform is doing anything crazy.&lt;br /&gt;&lt;br /&gt;Using an approach similar to this, my customer was able to show that his bottleneck was actually in one of his own handmade components that invoked on a back-end server using RMI - the hit was in the order of 850ms, using the lion's share of the latency. I'm not sure what he's done since then to minimize this hit, but at least we know where the problem is.&lt;br /&gt;&lt;br /&gt;In summary: Aspect-Oriented Programming is great for weaving in cross-cutting concerns such as logging, security or transactionality into your application code - it's also a nice tool to have for performance diagnosis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-1151671099326093338?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/1151671099326093338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=1151671099326093338' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1151671099326093338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1151671099326093338'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/09/using-aspectj-to-diagnose-servicemix.html' title='Using AspectJ to diagnose ServiceMix component performance'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-8060658621333396972</id><published>2008-09-19T03:06:00.000-07:00</published><updated>2008-09-19T03:10:17.212-07:00</updated><title type='text'>CXF, JMS &amp; the risk of acknowledged-but-not-processed messages</title><content type='html'>May God speed &lt;a href="http://www.liquid-reality.de/display/liquid/2008/08/25/Better%20JMS%20Transport%20for%20CXF%20Webservice%20using%20Apache%20Camel"&gt;Christian Schneider&lt;/a&gt; and his refactoring of the CXF JMS endpoints to be more configurable. I was looking into the reliability of the JMS implementation in CXF, and (from the code), I see that the JMS acknowledgement mode used by CXF is hard-coded to be &lt;code&gt;Session.AUTO_ACKNOWLEDGE&lt;/code&gt;. So, I thought, it's not transactional - but that's ok, right? As long as the message is acknowledged &lt;em&gt;after&lt;/em&gt; my CXF implementation code then I'm good... right?&lt;br /&gt;&lt;br /&gt;I wanted to verify that this was the case; so, I modified the jms_queue demo to exit unmercifully in the middle CXF impl code for the &lt;code&gt;greetMe()&lt;/code&gt; and &lt;code&gt;greetMeOneWay()&lt;/code&gt; methods. I had hoped that this would mean that the incoming message, having been unacknowledged, would be redelivered - however, it appears that the message is not redelivered. It looks like CXF is acknowledging the message &lt;em&gt;before&lt;/em&gt; we actually process it. Ouch.&lt;br /&gt;&lt;br /&gt;The implications of this are serious: if you're implementing a listener for one-way (in-only) messages with CXF then there is a possibility that messages delivered just before an emergency server shutdown will have been acknowledged but not processed: lost forever. To get around this for now, I'd recommend using Camel to listen transactionally from the JMS queue and send the message to CXF for marshalling (as per Christian's article &lt;a href="http://activemq.apache.org/camel/better-jms-transport-for-cxf-webservice-using-apache-camel.html"&gt;"Better JMS Transport for CXF"&lt;/a&gt;). That way, if the server goes down then message will be redelivered at a later stage. Of course, you should in your code check to see if the message is a redelivery, and take appropriate action to ensure that your application remains consistent.&lt;br /&gt;&lt;br /&gt;The impact of this "early acknowledgement" on request-response services over JMS is not so fatal, as failure of the sever will result in no reply message getting to the client - a timeout will alert the client that something has gone wrong and they can resend.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-8060658621333396972?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/8060658621333396972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=8060658621333396972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/8060658621333396972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/8060658621333396972'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/09/cxf-jms-risk-of-acknowledged-but-not.html' title='CXF, JMS &amp; the risk of acknowledged-but-not-processed messages'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-7648708507272728918</id><published>2008-09-09T22:08:00.000-07:00</published><updated>2008-09-10T05:04:32.677-07:00</updated><title type='text'>Setting up a PostgreSQL database for ActiveMQ</title><content type='html'>The default ActiveMQ configuration file (in &lt;code&gt;conf/activemq.xml&lt;/code&gt;) has a sample fragment of Spring configuration that shows how to use PostgreSQL as a data source. So, pointing ActiveMQ to PostgreSQL is easy; the problem you may run into is how to configure PostgreSQL in the first place with an appropriate account for ActiveMQ. &lt;br /&gt;&lt;br /&gt;The instructions below assume that you've installed postgres in the directory &lt;code&gt;/usr/local/pgsql&lt;/code&gt;, and that postgres is being run by the user 'postgresql'. It also assumes that you're using an &lt;code&gt;bash&lt;/code&gt; or &lt;code&gt;sh&lt;/code&gt; shell; however, I"m sure it's not rocket science to map what follows to DOS shell for Windows.&lt;br /&gt;&lt;br /&gt;You should include the PostgreSQL bin directory in your path: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; $ export PATH=/usr/local/pgsql/bin:$PATH&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Decide on a file system location for the postgresql data files, say: &lt;code&gt;/Users/postgresql/data&lt;/code&gt;. Set the &lt;code&gt;PGDATA&lt;/code&gt; variable to point to this directory.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; $ export PGDATA=/Users/postgresql/data&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;The commands that follow will use &lt;code&gt;$PGDATA&lt;/code&gt; to determine the location of the database files.&lt;br /&gt;&lt;br /&gt;Initialize the database data directory: &lt;br /&gt; &lt;br /&gt;&lt;pre&gt;&lt;br /&gt; $ initdb &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;... This will initialize the database in the &lt;code&gt;$PGDATA&lt;/code&gt; directory.&lt;br /&gt; &lt;br /&gt;Now start the database controller: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; $ pg_ctl -l logfile start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;You should see a message 'server starting'&lt;br /&gt; &lt;br /&gt;Now create a database called &lt;code&gt;activemq-db&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; $ createdb activemq-db&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;To log into the database, use the &lt;code&gt;psql&lt;/code&gt; command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; $ psql activemq-db&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;This gets you in as the current user ('postgresql') - the default security is very lax: let's enforce password protection for the database. To do this, first create a password for the &lt;code&gt;postgresql&lt;/code&gt; user: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; activemq-db=&gt; alter user postgresql with password 'foo';&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;Create a username for activemq with appropriate password: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; activemq-db=&gt; create user activemq with password 'pa55w0rd';&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Exit the &lt;code&gt;psql&lt;/code&gt; shell using the &lt;code&gt;\q&lt;/code&gt; command: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; \q&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Edit the &lt;code&gt;$PGDATA/conf/pg_hba.conf&lt;/code&gt; file, to specify that the activemq user can access the activemq-db. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD&lt;br /&gt; host    all          postgresql    127.0.0.1         255.255.255.255   md5&lt;br /&gt; local   all          postgresql                                        md5&lt;br /&gt; host    activemq-db  activemq      127.0.0.1         255.255.255.255   md5&lt;br /&gt; local   activemq-db  activemq                                        md5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;Now, bounce the database.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; $ pg_ctl reload&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;You should now be prompted for a password when you log into to the database as the activemq user.&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;&lt;br /&gt; $ psql activemq-db activemq&lt;br /&gt; Password for user activemq: &lt;br /&gt; Welcome to psql 8.3.3, the PostgreSQL interactive terminal.&lt;br /&gt; &lt;br /&gt; Type:  \copyright for distribution terms&lt;br /&gt;        \h for help with SQL commands&lt;br /&gt;        \? for help with psql commands&lt;br /&gt;        \g or terminate with semicolon to execute query&lt;br /&gt;        \q to quit&lt;br /&gt; &lt;br /&gt; activemq-db=&gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In activemq, configure your postgres-ds data source to use the database 'activemq-db', with user 'activemq' and password 'pa55w0rd'. Now, when you start up, activemq will create the necessary tables to persist messages. You can validate that it has created these tables by using the &lt;code&gt;\d&lt;/code&gt; command in &lt;code&gt;psql&lt;/code&gt;: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; activemq-db=&gt; \d&lt;br /&gt;              List of relations&lt;br /&gt;  Schema |     Name      | Type  |  Owner   &lt;br /&gt; --------+---------------+-------+----------&lt;br /&gt;  public | activemq_acks | table | activemq&lt;br /&gt;  public | activemq_lock | table | activemq&lt;br /&gt;  public | activemq_msgs | table | activemq&lt;br /&gt; (3 rows)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And... you're done!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-7648708507272728918?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/7648708507272728918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=7648708507272728918' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7648708507272728918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7648708507272728918'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/09/setting-up-postgresql-database-for.html' title='Setting up a PostgreSQL database for ActiveMQ'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-4896072346421858729</id><published>2008-07-16T09:40:00.000-07:00</published><updated>2008-07-16T09:45:00.788-07:00</updated><title type='text'>JAX-RS (JSR-311) &amp; Apache CXF</title><content type='html'>Yesterday I did my first Webinar on open.iona.com (see "Open Source in the Enterprise, Webinar III" in &lt;a href="http://open.iona.com/resources/video-archived-webinars/"&gt;http://open.iona.com/resources/video-archived-webinars/&lt;/a&gt;). Dana Gardner covered big trends in the middleware and infrastructure sector, I talked about our support in FUSE for building RESTful services using JAX-RS, and my fellow IONA-ian Roland Tritsch did a live code demo showing, among other things, how to access both RESTful and SOAP services using browser-based javascript connected to a FUSE (Enterprise Apache CXF) service. Nice!&lt;br /&gt;&lt;br /&gt;I must echo Dan Kulp's thanks to Sergey Beryozkin for putting together some really nice work on CXF's JAX-RS implementation: I've been using the original JRA annotations with CXF previously, and the new JAX-RS stuff is simpler to use: no need to worry about wrapping parameter payload, and much easier to specify content types. Thanks Sergey!&lt;br /&gt;&lt;br /&gt;There's some good documentation on the JAX-RS CXF implementation on the &lt;a href="http://cwiki.apache.org/CXF20DOC/jax-rs-jsr-311.html"&gt;CXF site&lt;/a&gt;. There's also a list of todo's there as well; one thing I'd love to see is support for marking responses as cacheable so that we really cash-in (errr, exuse the pun) on REST.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-4896072346421858729?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/4896072346421858729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=4896072346421858729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/4896072346421858729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/4896072346421858729'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/07/jax-rs-jsr-311-apache-cxf.html' title='JAX-RS (JSR-311) &amp; Apache CXF'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-629320817883057078</id><published>2008-06-25T12:50:00.000-07:00</published><updated>2008-06-25T13:18:03.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iona progress merger acquisition reykjavik cxf apache'/><title type='text'>Reflections on Progress and IONA from Reykjavik</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_PAIXbU4eQiw/SGKnvpAV84I/AAAAAAAAAl8/Zz7mwsPhrTQ/s1600-h/view-from-hotel.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp3.blogger.com/_PAIXbU4eQiw/SGKnvpAV84I/AAAAAAAAAl8/Zz7mwsPhrTQ/s320/view-from-hotel.jpg" alt="" id="BLOGGER_PHOTO_ID_5215915755351438210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I have spent the day traveling on airplanes, and finally arrived in beautiful Reykjavik at about 1600 without baggage but very glad to be in Iceland again. It's a beautiful, awe-inspiring landscape and the people are lovely. Is this a thing were folk from island nations naturally resonate with each other?  Anyway: I'm here doing some work on Apache CXF with a big player in the telco market here. I look forward to getting stuck in tomorrow.&lt;br /&gt;&lt;br /&gt;I've been out of touch for most of the day, gleaning information on a drip about today's big news that Progress Software has agreed to purchased the company I work for, IONA Technologies, later this year. This is a really great move for Progress; IONA has strong technology offerings, an innovative engineering department and a smart services organization hell-bent on customer success. It's also a fantastic opportunity for the great people I work with in IONA to play an even bigger role in the SOA market. Today's statement also indicated continued investment in IONA's Orbix, Artix and open-source FUSE offerings; I'm looking forward to seeing how Progress will approach a blended, hybrid business model.  And, I can't wait to get my hands on Progress's technology :)&lt;br /&gt;&lt;br /&gt;IONA has been such a great place to work, since my first incarnation here in 1995 as an engineer. I was reminiscing with myself over dinner on all the places I've traveled to while working as a consultant in the "old IONA", and got so excited that I mapped them on Google Maps. Check it out! Now, where is the new Progress going to take us?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_PAIXbU4eQiw/SGKmjkJirwI/AAAAAAAAAl0/FVIbFN5LG3U/s1600-h/Ade%27s+Consultancy+Map+2008.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp0.blogger.com/_PAIXbU4eQiw/SGKmjkJirwI/AAAAAAAAAl0/FVIbFN5LG3U/s320/Ade%27s+Consultancy+Map+2008.JPG" alt="" id="BLOGGER_PHOTO_ID_5215914448377786114" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-629320817883057078?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/629320817883057078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=629320817883057078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/629320817883057078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/629320817883057078'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/06/reflections-on-progress-and-iona-from.html' title='Reflections on Progress and IONA from Reykjavik'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_PAIXbU4eQiw/SGKnvpAV84I/AAAAAAAAAl8/Zz7mwsPhrTQ/s72-c/view-from-hotel.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-1821651050355222025</id><published>2008-06-20T07:14:00.000-07:00</published><updated>2008-06-20T07:15:14.301-07:00</updated><title type='text'>Tales from the Serverside Prague - Day III</title><content type='html'>Hurrah for &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;! &lt;a href="http://www.tedneward.com/"&gt;Ted Neward&lt;/a&gt; showed us all the sheer joy of Scala this morning. I think I might be hooked. Yet now I am truly torn: to which language do I dedicate my spare cycles - jRuby, Groovy or Scala? The answer I think is all of them, for the sheer fun of it. The exotic part of me says jRuby first, but then the pragmatic part of me says Scala might be the way to go.&lt;br /&gt;&lt;br /&gt;I've been dipping in and out of the day since then: I sat in on John Davies replay of his extreme transaction processing material. After his talk the feedback forms were glowing with positives like "the best material in the whole conference"  Nice work John - just what we'd expect from an IONA employee ;)&lt;br /&gt;&lt;br /&gt;Ola Bini from ThoughtWorks showed off couple of jRuby test frameworks; one of the nice side applications of this, apart from testing your jRuby code, is that you can use jRuby to test your &lt;em&gt;Java&lt;/em&gt; code. As it turns out I spent most his talk down the back doing some Junit test cases for a project I'm working on at the moment; there is not doubt that Ola's tests in jRuby looked a hell-of-a-lot less verbose than my Java-bound test framework.&lt;br /&gt;&lt;br /&gt;I attended the fireside chat on Architectural Patterns in Mule by Antoine Borg. He's doing a great job; that said, it's all the same as the stuff I covered in my own fireside chat yesterday! The  EIPs supported by Mule directory are implemented in XML; while functionaly equivalent it's no where near as ergonomic as the Camel DSL, in my humble opinion. I've done XML-based EIP before, and you can get bogged down in XML. It is nice to see that Mule 2.0 is using Spring Schemas to simplify the XML configuration.&lt;br /&gt;&lt;br /&gt;Off home in a few hours to Dublin. This year's TSSJS in Prague was a really high quality event; hats off to the speakers, and a big thank you to the tech target team!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-1821651050355222025?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/1821651050355222025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=1821651050355222025' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1821651050355222025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1821651050355222025'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/06/tales-from-serverside-prague-day-iii.html' title='Tales from the Serverside Prague - Day III'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-7779421117123798859</id><published>2008-06-20T01:01:00.001-07:00</published><updated>2008-06-20T01:01:40.608-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tssjs java dsl'/><title type='text'>Tales from the Serverside Prague - Day II</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;Neal Ford gave a cracking keynote this morning on the evolution of programming abstractions towards domain specific languages. He talked about internal DSL's (like Apache Camel) using fluent interfaces in languages like Java, and proposed that internal DSL's work better in languagues like ruby and groovy. Ultimately though, internal DSL's are limited by the language they're embedded in, forcing you to match the parent language's syntax . In an external DSL, you design your language from scratch; this year a number of products (like mps from JetBrains) will address the problem of how to easily create domain specific languages.&lt;br /&gt;&lt;br /&gt;There was a whole part of Neal's talk about considering XML to be "deprecated". My friend &lt;a href="http://www.ciaranmchale.com"&gt;Ciaran McHale&lt;/a&gt; has believed this since day one ;) Neal did concede that XML is "marginally OK as a data format", but in terms of configuration or communicating intent it's overkill.&lt;br /&gt;&lt;br /&gt;Eugene Ciurana's presentation on real-world SOA &amp;amp; event-driven architecture showed a really nice case study of a SOA system. One of the biggest challenges on this is how to get information from millions of network-enabled children's toys. Interesting stuff, but also interesting in terms of the price tag; he saved quite a lot of money by using open source infrastructure along with best-of-breed commercial products.&lt;br /&gt;&lt;br /&gt;I hooked up with Ted Neward and the new editor of TSS, Peter Varhol on the way to John Davies's talk on extreme transaction processing. Ted is in great form; we had a chat about DSLs and what it might take to get the JVM to make the most of multi-core CPUs. Dammit we should have had a tape recorder; who knows though, maybe there was some &lt;a href="http://tssblog.blogs.techtarget.com/2007/06/12/neward-and-trenaman-consider-rest-or-the-great-and-complete-soap-vs-pox-debate/"&gt;secret agents&lt;/a&gt; knocking around. That said, many of the things we had chatted about came up again in the expert panel on next generation languages, with Ted Neward, Ola Bini and Guillaume LaForge. Ola's jRuby talk later on has shown me the light; I am now torn between going headlong into either a scala or jRuby devlopement binge.&lt;br /&gt;&lt;br /&gt;Kirk Pepperdine blew everyone away with a presentation on Java performance and concurrency. The rise of the multi-core CPU means that now, more than ever, sloppy multi-threaded code is going to begin to throw up problems that never arose in our single CPU machines. Hmmm. Maybe I'll hang on to this old single-CPU Dell laptop for a bit longer...&lt;br /&gt;&lt;br /&gt;I gave a fireside chat on implementing enterprise integration patterns using Apache software. I've been working with the FUSE distribution of ServiceMix, Active MQ, Camel and CXF for some time now and it was nice to get a chance to share the experience. I showed off the &lt;a href="http://activemq.apache.org/camel/"&gt;Camel DSL&lt;/a&gt;, and we went on to talk about innovation adoption (getting around the "let's just code it up in Java" objection), open source licensing (is there a best license / business model?), and whether standards really matter. On that last point I think we reached some agreement: standards matter at the edges of your system where you're working with other parties. Internally, however, you're free to do whatever you want.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-7779421117123798859?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/7779421117123798859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=7779421117123798859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7779421117123798859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7779421117123798859'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/06/tales-from-serverside-prague-day-ii.html' title='Tales from the Serverside Prague - Day II'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5293855394515354397</id><published>2008-06-18T08:01:00.000-07:00</published><updated>2008-06-18T08:02:49.172-07:00</updated><title type='text'>Tales from the Serverside Prague - Day I</title><content type='html'>Day one at the server-side Java Symposium in Prague; but the fun started last night when Kirk Pepperdine smacked me for suggesting that the agenda was very like last year. Last year in Barcleona was all about caching technologies; this year the focus is on dynamic languages: jRuby, Groovy and Scala are all on the agenda.&lt;br /&gt;&lt;br /&gt;Stephan Janssen kicked off the day's proceedings with a really good keynote on the landscape of technologies for developing  rich internet applications, including DHTML, Google Web Toolkit, Flex/Air &amp;amp; JavaFX. I think what was most impressive is that he showed how the &lt;a href="http://parleys.com"&gt;parleys.com&lt;/a&gt; web-site (an educational web-site for posting up tech talks including audio, video and slides) has been built using all four (five, if you include this Silverlight version). Kudos to Stephan: I've always felt that when you apply a number of techhnologies to the same problem you get a really good picture of which works best. The message? DHTML was difficult. GWT was great, but needed one or two tickles to  support Internet Explorer. Flex/Air was great, but you have two different development streams for your online &amp;amp; offline application code. Finally, JavaFX is very promising, but adoption may be hindered by the fact that the nice guys at Sun haven't got a version of JavaFX for Apple Mac yet.&lt;br /&gt;&lt;br /&gt;Costin Leau from &lt;a href="http://www.springsource.com"&gt;SpringSource&lt;/a&gt; gave an in-depth view of how Spring Dynamic Modules supports OSGi development and deployment. Benefits? Better modulatory, versioning of artifacts and operations control. I look forward to seeing how the new SpringSources Application Platform (based on Tomcat, OSGi and Spring) gets on. Hmmm. Am I the only on that's shocked though that after more than 12 years of Java, we're still coming up with new ways to prevent class loading problems?&lt;br /&gt;&lt;br /&gt;GigaSpaces Nati Shalom's session was notable in that he discussed that business drivers behind the need of scalable systems: the number of financial transactions, data, and users is constantly growing. Further, the number of traffice spikes (overload situations that can bring down your business is growing). The challenge is to scale up cost-effectively while not sacrificing reliability and performance. Over-provisioning is one expensive way of catering for peak traffic, but has lead to average industry server utilization rates of 15-20%.&lt;br /&gt;&lt;br /&gt;Michael Keith from Oracle presented on SOA using Service Component Architecture (SCA). SCA is all very reasonable and sensible, but I'm not convinced that it's something that developers can get really excited about.&lt;br /&gt;&lt;br /&gt;Mike Aizatsky from Google's presentation on synchronization models for multi-threaded applications was a gem, where he described nine models including the unexpected "No Multithreading" threading model. His advice: pick the simplest model, don't over-engineer your solution. I really enjoyed this talk and got a lot out of it. On the way out of Mike's talk I caught the end of Holly Cummin's presentation on java performance tuning &amp;amp; contented(!) locks; it's a pity these two sessions were on the same time, as they would have really complemented each other.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5293855394515354397?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5293855394515354397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5293855394515354397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5293855394515354397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5293855394515354397'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/06/tales-from-serverside-prague-day-i.html' title='Tales from the Serverside Prague - Day I'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5418432390613474966</id><published>2008-04-09T03:43:00.000-07:00</published><updated>2008-06-25T13:19:07.443-07:00</updated><title type='text'>Making powerpoint movies: RESTful services with FUSE</title><content type='html'>I made my first powerpoint movie last week, on building RESTful services with FUSE. It's part of the FUSE Master Class, and has been posted on open.iona.com &lt;a href="http://open.iona.com/wiki/display/ProdInfo/FUSE+Master+Class+Series"&gt;wiki&lt;/a&gt;. I've presented that material at a number of places now, but there really is something very challenging about presenting to nothing but Camtasia on a dusty laptop. Not having an audience to feed off is unnerving: I found when I did a playback that there was an irritating amount of "ommm" and "ehhh", and I ended up doing a lot re-takes.&lt;br /&gt;&lt;br /&gt;In the end, I settled on writing a script for my narration. Reading from a script does take a bit of magic out of the delivery, but you can still improvise around it and it saves a whole lot of time. Also, I filmed segments of no more than 4 or 5 slides at a time. This keeps you on track and allows you to redo stuff quickly. I have a hunch it also saves on edit time trying to edit large tracts of movie.&lt;br /&gt;&lt;br /&gt;Camtasia's an OK tool - this being my first time doing screen capture I don't have any thing else to compare with. I do drool with envy at my colleague's MacBook Pro: Apple's "Keynote" provides built-in support for "filming" your powerpoint, and then you can use i-Movie to edit in talking heads to minimise the "death-by-powerpoint" effect and add a little character. Gotta get me one of those machines :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5418432390613474966?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5418432390613474966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5418432390613474966' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5418432390613474966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5418432390613474966'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/04/making-powerpoint-movies-restful.html' title='Making powerpoint movies: RESTful services with FUSE'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-2857100452785776558</id><published>2008-04-07T02:51:00.000-07:00</published><updated>2008-04-09T04:01:18.077-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CXF FUSE code-first'/><title type='text'>That  not found in this context JAX-B exception</title><content type='html'>I was throwing together a Java code-first example for a CXF web service this morning, and I encountered a scary gotcha. I want to create a simple customer information service, with an interface like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public interface CustomerService {&lt;br /&gt; Customer findCustomerByName(String firstName, String lastName);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... The Customer type is a straightforward bean, as per below:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public class Customer {&lt;br /&gt; private String firstName;&lt;br /&gt; private String lastName;&lt;br /&gt; private String skypeId;&lt;br /&gt; private String telephoneNumber;&lt;br /&gt; private int age;&lt;br /&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public String getFirstName() {&lt;br /&gt;   return firstName;&lt;br /&gt; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public void setFirstName(String firstName) {&lt;br /&gt;   this.firstName = firstName;&lt;br /&gt; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public String getLastName() {&lt;br /&gt;   return lastName;&lt;br /&gt; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public void setLastName(String lastName) {&lt;br /&gt;   this.lastName = lastName;&lt;br /&gt; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public String getSkypeId() {&lt;br /&gt;   return skypeId;&lt;br /&gt; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public void setSkypeId(String skypeId) {&lt;br /&gt;   this.skypeId = skypeId;&lt;br /&gt; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public String getTelephoneNumber() {&lt;br /&gt;   return telephoneNumber;&lt;br /&gt; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public void setTelephoneNumber(String telephoneNumber) {&lt;br /&gt;   this.telephoneNumber = telephoneNumber;&lt;br /&gt; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public int getAge() {&lt;br /&gt;   return age;&lt;br /&gt; }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public void setAge(int age) {&lt;br /&gt;   this.age = age;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Customer(String firstName, String lastName, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                  String skypeId,&lt;br /&gt;                 String telephoneNumber, int age) {&lt;br /&gt; super();&lt;br /&gt; this.firstName = firstName;&lt;br /&gt; this.lastName = lastName;&lt;br /&gt; this.skypeId = skypeId;&lt;br /&gt; this.telephoneNumber = telephoneNumber;&lt;br /&gt; this.age = age;&lt;br /&gt; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When my service implementation returns a &lt;span style="font-family:courier new;"&gt;Customer&lt;/span&gt;, I get an exception:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;org.apache.cxf.interceptor.Fault: Marshalling Error: com.iona.ps.codefirst.Customer is not known to this context&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Looks quite scary. I lost a lot of time trying to figure out what was going on, thinking that maybe I needed to add JAXB annotations to my &lt;span style="font-family:courier new;"&gt;Customer&lt;/span&gt; class. It turns out however that the problem is that my Bean class doesn't have a default constructor. Ouch. Without a default constructor in place, the JAXB runtime cannot create a default instance of the class. Adding the default constructor to the bean makes everything better.&lt;br /&gt;&lt;br /&gt;I've seen through Google that lots of people have encountered this problem before - feels like a usability issue to me. While it may be the case that you need a default constructor in JAXB, CXF should give a more helpful message than "not known to this context".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-2857100452785776558?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/2857100452785776558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=2857100452785776558' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2857100452785776558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/2857100452785776558'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/04/i-was-throwing-together-java-code-first.html' title='That &lt;class&gt; not found in this context JAX-B exception'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-3396371529425239000</id><published>2008-03-06T12:59:00.000-08:00</published><updated>2008-03-06T13:23:13.359-08:00</updated><title type='text'>Little fluffy cloudsmith</title><content type='html'>I built my first public software distribution over the last week using &lt;a href="http://www.cloudsmith.com/"&gt;Cloudsmith&lt;/a&gt;. Cloudsmith is such a cool idea: you can assemble your own favourite software distributions and share them with like-minded people who  can use the Cloudsmith "materializer" to download the lot in one go.  Check out my &lt;a href="http://www.cloudsmith.com/dynamic/materialize/$0cHVibGljLmFkcmlhbi50cmVuYW1hbjtGdXNlLUJpZy1CYW5nLURpc3Rybzs=.mspec"&gt;FUSE Big Bang Distro&lt;/a&gt;, containing the latest (at time of writing) set of IONA FUSE components for Windows. I've also created a distribution I call &lt;a href="http://www.cloudsmith.com/dynamic/materialize/$0cHVibGljLmFkcmlhbi50cmVuYW1hbjtKb29sYm94Ow==.mspec"&gt;Joolbox&lt;/a&gt; for all those bits and pieces you need in Java development. Right now it just contains Maven, Ant and a few other bits and pieces... watch that space.&lt;br /&gt;&lt;br /&gt;I found the current beta UI (based on Seam) to be a little clunky at times; for example, there's no hour-glass when you you're waiting, which can be a little disconcerting when you don't know if you've really pressed something or not. However this clunkiness was more than made up for by the responsiveness of the Cloudsmith team who were able to iron things out; they assure me that a new update of the UI is underway for their big rollout at &lt;a href="http://www.eclipsecon.org/"&gt;Eclipsecon&lt;/a&gt;. In retrospect, it would have gone a lot easier if I'd actually Followed the Instructions on each dialogue rather than just racing ahead three sheets to the wind ;)&lt;br /&gt;&lt;br /&gt;What might Cloudsmith lead to? Thinking with a big hat on, Cloudsmith could lead to the absolute democratization of software distribution: anyone anywhere can rapidly assemble a full software stack from freely available components, and then provide services, support and training on that distribution. And just think of the potential value of having all the worlds developers huddle together as a community in the cloud. In the meantime, Cloudsmith has the potential to solve some of my problems in the small like how to rapidly pull down all my develop tools the next time my hard drive fails, or how to share my development environment with customers and colleagues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-3396371529425239000?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/3396371529425239000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=3396371529425239000' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3396371529425239000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3396371529425239000'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/03/little-fluffy-clouds.html' title='Little fluffy cloudsmith'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-7120053563538823545</id><published>2008-02-21T04:21:00.000-08:00</published><updated>2008-02-21T05:37:26.843-08:00</updated><title type='text'>Confused with JBI exchanges? Use the spec, Luke.</title><content type='html'>In a previous entry I mentioned &lt;a href="http://trenaman.blogspot.com/2008/02/fuse-esb-and-jbi-my-new-found-loves.html"&gt;my new found love of JBI&lt;/a&gt;. After my initial flirtations, my love has grown deeper: I believe that JBI and I are now something of an item. Hurrah!&lt;br /&gt;&lt;br /&gt;I'd like to share something about my new relationship. At first, I had admired JBI from afar, and had hoped that I would be able to master JBI &lt;span style="font-style: italic;"&gt;without&lt;/span&gt; having to go off and read the specification. In some respects this is true - you can build a &lt;a href="http://open.iona.com/"&gt;Fuse ESB&lt;/a&gt; JBI-compliant solution entirely through configuration &lt;span style="font-style: italic;"&gt;without &lt;/span&gt;any code, or without having to dig deep into JBI. This is good: after all, that Fuse ESB uses JBI internally should not be a concern to most users.&lt;br /&gt;&lt;br /&gt;However, if you want to code up your own POJO then you need to get an understanding of how your code should interact with JBI's Normalised Message Router (NMR) for different message exchange paradigms (e.g. in-only, on-only-robust, in-out). Implementing an in-only provider? Your code should set the status of the exchange to &lt;span style="font-family:courier new;"&gt;DONE&lt;/span&gt;, and then send the exchange back to the NMR. Doing in-out? Your code should set a response, leave the status alone, send the exchange back to the NMR, and then expect to receive a &lt;span style="font-family:courier new;"&gt;DONE&lt;/span&gt; exchange later on.&lt;br /&gt;&lt;br /&gt;For new users accustomed to simple RPC approaches this feels a little strange, confusing, and perhaps a little frustrating. I empathise: if it's an "in-only" message exchange, then why does my code have to send back the exchange? If it's an "in-out" message exchange, and my code has returned a response, then why should I subsequently receive a notification that the exchange is done?&lt;br /&gt;&lt;br /&gt;I urge you though to resolve the awkward silence by looking to the &lt;a href="http://jcp.org/aboutJava/communityprocess/final/jsr208/index.html"&gt;JBI 1.0 specification&lt;/a&gt; - it's remarkably readable, and the sections on the NMR provide some real insight on what the JBI container expects of you. With these insights in place you can do some great stuff. The answers, by the way to the questions above concern the decoupling in time of the consumer from the provider, and providing support for reliability in the underlying message exchange.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-7120053563538823545?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/7120053563538823545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=7120053563538823545' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7120053563538823545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/7120053563538823545'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/02/confused-with-jbi-exchanges-use-spec.html' title='Confused with JBI exchanges? Use the spec, Luke.'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5448642453121516123</id><published>2008-02-14T04:59:00.000-08:00</published><updated>2008-02-14T05:43:40.060-08:00</updated><title type='text'>Fuse ESB and JBI, my new-found loves...</title><content type='html'>I've having the pleasure of working with Ashwin Karpe on producing some training material on JBI, in particular the &lt;a href="http://open.iona.com"&gt;Fuse ESB &lt;/a&gt;implementation of JBI based on &lt;a href="http://servicemix.apache.org"&gt;Apache ServiceMix&lt;/a&gt;. I first looked into JBI a few years ago back when &lt;a href="http://incubator.apache.org/cxf/"&gt;Apache CXF&lt;/a&gt; was Celtix and we were all a lot younger. Back then, I just couldn't see the point of JBI: whenever someone would try and explain it to me they would attempt to explain something I didn't know (JBI) in terms of something I still didn't know (Binding Components (BCs), Service Engines (SEs), Normalized Message Router (NMR) etc.). My eyes would gloss over, and I'd go back to what I was doing previously.&lt;br /&gt;&lt;br /&gt;My eyes where opened when I got a play with the great set of JBI components in FUSE ESB. Using FUSE, I can create listeners (for example HTTP, JMS, FTP, FILE) and wire them using &lt;a href="http://www.enterpriseintegrationpatterns.com/"&gt;enterprise integration patterns&lt;/a&gt; (like filters, transformers and content-based routers) into some sweet integration flows, sending data on to other systems (again using  transport components like HTTP, JMS, FTP and FILE). Now, that's something tangible that I know I can use when I'm out on the road.  Just recently, a guy I know asked me about creating an FTP plugin for CXF to accept CSV (comma separated value) payload: maybe a year or two ago I would have tried to find a way to do that, now, I'd just do it using Fuse ESB.&lt;br /&gt;&lt;br /&gt;Most of what you do with FUSE ESB/ServiceMix can be done by simply customising (via configuration) the transport components and patterns that are provided in the box. Occasionally though you may want to write a POJO that sits in your integration flow: I'm currently looking into writing a chapter in our training material on how to wire POJO's (i.e. JBI's &lt;span style="font-family: courier new;"&gt;MessageExchangeListener&lt;/span&gt;s) into a flow.&lt;br /&gt;&lt;br /&gt;In the meantime, for anyone interested in playing with JBI, take a look at the documentation on &lt;a href="http://open.iona.com"&gt;open.iona.com&lt;/a&gt; and &lt;a href="http://tompurcellstechblog.blogspot.com/2008/01/servicemix-what-i-did-not-understand.html"&gt;Tom Purcell's blog&lt;/a&gt;, which has some interesting entries on JBI from a beginner's perspective.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5448642453121516123?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5448642453121516123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5448642453121516123' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5448642453121516123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5448642453121516123'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/02/fuse-esb-and-jbi-my-new-found-loves.html' title='Fuse ESB and JBI, my new-found loves...'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-3123248021869451098</id><published>2008-01-28T07:00:00.000-08:00</published><updated>2008-01-28T07:16:09.169-08:00</updated><title type='text'>OOP 2008</title><content type='html'>Just back from OOP 2008 in Munich - this is a fantastic conference, with a great programme and a really smart bunch of attendees. My thanks to Wolfgang Reuter and all the OOP staff for putting together such as great event.&lt;br /&gt;&lt;br /&gt;I gave two presentations at the event, a 45 minute presentation on using CXF and GWT to create and consume RESTful services, and then a full-day workshop on building services with CXF - I really enjoyed both; in particular, I was chuffed with the attendance and enthusiasm for CXF at the workshop. One of the attendees has already written up some &lt;a href="http://ooppression.blogspot.com/2008/01/developing-open-source-services-using.html"&gt;thoughts &lt;/a&gt;on the workshop - thanks James!&lt;br /&gt;&lt;br /&gt;I'll happily send on the PDF of my presentation slides for the RESTful services session - just drop me a line in the comments below.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-3123248021869451098?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/3123248021869451098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=3123248021869451098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3123248021869451098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3123248021869451098'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/01/oop-2008.html' title='OOP 2008'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-3563624530791268405</id><published>2008-01-14T06:40:00.000-08:00</published><updated>2008-01-14T09:17:28.719-08:00</updated><title type='text'>The Dark Side of the Source</title><content type='html'>One of the great benefits of using open-source, or any source-available software in general, is that, well, you have the source. If you run into a problem then you can debug right into the source-code of your third-party libraries and figure out what's going on. Fantastic. As a consultant on the road I welcome the ability to dive deep.&lt;br /&gt;&lt;br /&gt;However, there is a dark side to source code availability: you can get sucked in very easily debugging code that isn't yours. Think about that. You encounter a bug, and, instead of having X lines of code to debug (where X is the number of lines of application code) you've got X + Y lines of code to debug (where Y is the number of of open-source lines of code). Now, the extra lines of code (Y) may give you greater visibility in solving your problem. Or, you may end up loosing time trying to figure out somebody elses code: I call this "The Dark Side of the Source". Recently, I found myself deep in code involving Jetty Continuations, and lost a lot of time trying to figure out what was going on. In the end we had to get directly in touch with the code author to get a fix: if only we'd known to go their first!&lt;br /&gt;&lt;br /&gt;So: having the source is great. But don't assume that just because you have the source you can solve all the problems all the time: the source will help you, but you have to be mindful of the impact on your productivity. Go with an open source community that can help you if you get into trouble, and one that gives you a professional support offering for when you  get into deeper trouble. The guys at Redmonk (Michael Cote and Stephen O'Grady) have written a nice paper on this - "Working with Open-Source Companies". I got the paper for free from the open.iona.com communities site; I recommend the read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-3563624530791268405?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/3563624530791268405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=3563624530791268405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3563624530791268405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/3563624530791268405'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2008/01/dark-side-of-source.html' title='The Dark Side of the Source'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-821642029948647247</id><published>2007-09-03T08:07:00.000-07:00</published><updated>2007-10-07T23:43:14.183-07:00</updated><title type='text'>Thoughts on JiBX</title><content type='html'>I've written before with Ted Neward on code-first vs WSDL-first contract design for services.  We had a lot of fun on the  &lt;a href="http://tssblog.blogs.techtarget.com/contract-first-or-code-first-design-part-1/"&gt;Server Side&lt;/a&gt; with that  - thanks Ted (and the men in black).&lt;br /&gt;&lt;br /&gt;Since then, I've mellowed a lot; I'm quite happy to use JAX-B and JAX-WS annotations &lt;span style="font-style: italic;"&gt;where appropriate&lt;/span&gt; to generate my WSDL and XSD SOA artifacts. Maybe Ted's mantra of "Code first, contract aware" has rubbed off on me.&lt;br /&gt;&lt;br /&gt;Recently thought I've noticed another approach, &lt;a href="http://jibx.sourceforge.net/"&gt;JiBX&lt;/a&gt;, that offers a middle ground. Instead of embedding annotations inside your Java classes (code-first), or writing your own schema (contract first), you put XML binding information into a separate "binding" file. You then run a tool against the Java classes and binding file and out drops the schema.&lt;br /&gt;&lt;br /&gt;I look forward to playing with JiBX, but I can't help but feel cautious. One of the compelling reasons to use a code first approach is the idea that it's somewhat simpler than writing XSD or WSDL by hand. JiBX just doesn't look "easy" to me; it seems that if you want to you use JiBX then you need to know about your Java interfaces, your desired schema/XML, and, how to use JIB-X binding files.  So, we end up having to learn new stuff (JiBX) to do things we can do already (XML Schema).&lt;br /&gt;&lt;br /&gt;I think what I'm lacking is the presence of a "JiBX in Anger" article (remember &lt;a href="http://ant.apache.org/ant_in_anger.html"&gt;Ant in Anger&lt;/a&gt;?) that shows how JiBX solves the Java/XML problem way better than the approaches I know already. From my own recent experience with the CXF &lt;span style="font-family:courier new;"&gt;java2wsdl &lt;/span&gt;tool (see the previous entry on this blog), I know that JiBX would give me explicit control over how XSD artifacts get generated from pre-JDK 1.5 annotation-free classes. Very nice - but worth the overhead of learning JiBX?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-821642029948647247?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/821642029948647247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=821642029948647247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/821642029948647247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/821642029948647247'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2007/09/thoughts-on-jibx.html' title='Thoughts on JiBX'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-1013321685422109709</id><published>2007-08-31T09:38:00.000-07:00</published><updated>2007-09-03T08:06:19.413-07:00</updated><title type='text'>Code first mayhem: generating WSDL from EJB interfaces</title><content type='html'>I'm working on a project that involves writing stubs for EJB services. Our approach is to write a simple EJB that delegates to a web service (stub "intelligence" lies in the web service).&lt;br /&gt;&lt;br /&gt;Obviously, we want the web service to conform to the same API as the original EJB interface: same methods, same parameter lists, etc. So, I'm using the Artix &lt;span style="font-family:courier new;"&gt;java2wsdl &lt;/span&gt;tool to generate corresponding WSDL artifacts (and associated XSD) from the EJB interfaces. This tool is based on Apache CXF &lt;span style="font-family:courier new;"&gt;java2wsdl&lt;/span&gt;, which in turn is based on the reference implementation of JAX-B.&lt;br /&gt;&lt;br /&gt;Now, you'd think that this should be a cinch: however, I ran into a number of difficulties and had to some up with some crafty workarounds. The bottom line is that generating contracts from raw code is trickier that you might expect. Read on for your pleasure...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;First Problem: Naming Conflicts. &lt;/span&gt;The EJB interface uses types that create naming conflicts with wrapped-doc-literal artifacts.&lt;br /&gt;&lt;br /&gt;Who would have thought it? The EJB interface used a wrapping style that conflicted with the naming conventions for wrapped-doc-literal. The EJBs had APIs that looked like this:&lt;br /&gt;&lt;br /&gt; &lt;span style="font-family:courier new;"&gt;void &lt;span style="font-weight: bold;"&gt;sayHello&lt;/span&gt;(String s, &lt;span style="font-weight: bold;"&gt;SayHello&lt;/span&gt; params)&lt;/span&gt;,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;java2wsdl &lt;/span&gt;will try and create a schema definition for &lt;span style="font-family:courier new;"&gt;SayHello &lt;/span&gt;(the type in the parameter list). The tool will then try and create a wrapper XSD element for the &lt;span style="font-family: courier new;"&gt;sayHello &lt;/span&gt;message, also called &lt;span style="font-family:courier new;"&gt;SayHello&lt;/span&gt;. Ouch... naming collision here we come.&lt;br /&gt;&lt;br /&gt;To get around this, I took advantage of the fact that &lt;span style="font-family:courier new;"&gt;SayHello &lt;/span&gt;(the parameter type) was actually in a different Java package: I just needed to map the Java package to a different schema namespace. This is tricky though: the only way to do this in JAX-B is to annotate the source: I only had access to the class files. I posted the problem to the &lt;span style="font-family:courier new;"&gt;cxf-dev&lt;/span&gt; mailing list, you can read more on the problem &lt;a href="http://www.nabble.com/Is-there-any-way-to-customise-schema-namespaces-with-java2wsdl--tf4305933.html"&gt;there&lt;/a&gt;. The solution was to artificially recreate the EJB package structure, inserting &lt;span style="font-family:courier new;"&gt;package-info.java&lt;/span&gt; classes to control the mapping. Then, by placing this hierarchy in front of the EJB jars in the classpath, we were able to take control of the mapping as if the annotations had been their all along. Tricky, but fun: in the end we decided this was "Artful Hackery".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Second problem:&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;public fields clash with set/get methods.&lt;/span&gt;&lt;br /&gt;Some of the data types used by EJB had a public member (say &lt;span style="font-family:courier new;"&gt;foo&lt;/span&gt;) along with a &lt;span style="font-family:courier new;"&gt;getFoo()&lt;/span&gt; method:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class MyDataType {&lt;br /&gt;  &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;public int &lt;span style="font-weight: bold;"&gt;foo&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;     &lt;span style="font-family:courier new;"&gt;public int &lt;span style="font-weight: bold;"&gt;getFoo&lt;/span&gt;();&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;}&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Alarmingly, the &lt;span style="font-family:courier new;"&gt;java2wsdl &lt;/span&gt;compiler complained that there were "two members with the same name." Double ouch. It turns out that to fix this problem,  I had to add some smarts to the &lt;span style="font-family:courier new;"&gt;package-info.java&lt;/span&gt; file I created to front the package containing the data types, setting the &lt;span style="font-family:courier new;"&gt;XmlAccessorType &lt;/span&gt;to be &lt;span style="font-family:courier new;"&gt;FIELD&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;@javax.xml.bind.annotation.XmlAccessorType(&lt;br /&gt;  javax.xml.bind.annotation.XmlAccessType.FIELD&lt;br /&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Third problem:&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;beans need to have a no-argument constructor. &lt;/span&gt;One of the data-types used in an interface didn't have a default no-argument constructor. This was enough to stop the &lt;span style="font-family:courier new;"&gt;java2wsdl &lt;/span&gt;compiler in its tracks. I couldn't find a JAX-B workaround for this; also I don't know of a way to inject a no-argument constructor into an existing class.&lt;br /&gt;&lt;br /&gt;So: hurrah for Java decompilers: I decompiled the offending class, added a constructor, recompiled it and placed it in the CLASSPATH ahead of the Jar so that it would be picked up first.&lt;br /&gt;&lt;br /&gt;Phew. "Apart from that, it all went swimmingly".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-1013321685422109709?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/1013321685422109709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=1013321685422109709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1013321685422109709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/1013321685422109709'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2007/08/code-first-mayhem-generating-wsdl-from.html' title='Code first mayhem: generating WSDL from EJB interfaces'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5862547309732289650.post-5525652787618875537</id><published>2007-08-31T05:17:00.000-07:00</published><updated>2007-09-01T00:29:27.711-07:00</updated><title type='text'>And who are you, exactly?</title><content type='html'>My name is Ade, and I work for IONA Technologies as a Principal Consultant in their Services Organisation. As part of my role I get to travel a lot, meet customers, and design and build software solutions using a pretty wide range of middleware technologies: Web Services, CORBA, J2EE, JMS, open-source, closed source - all the usual suspects are there. I love my job - it's a great way to meet people and learn a whole lot of stuff.&lt;br /&gt;&lt;br /&gt;I've been blogging for a while on the IONA SOS blog (see sidebar for a link); I've also been getting lots of great opportunities to speak around Europe on SOA and on middleware.&lt;br /&gt;&lt;br /&gt;In this blog I'm going to share my middleware experiences - from the sublime to the ridiculous - and talk about my perspectives on architecting and implementing distributed systems.&lt;br /&gt;&lt;br /&gt;While I do have an academic background, it's not actually in distributed systems (although it was a whole lot of fun building a networked supercomputer out of the Maynooth software labs to run my Ph.D. experiments in genetic programming)... It turns out there's a lot your can do with 200 PCs and a shared file system ;)&lt;br /&gt;&lt;br /&gt;Anyway - welcome. I hope you find the articles on this blog interesting and helpful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5862547309732289650-5525652787618875537?l=trenaman.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://trenaman.blogspot.com/feeds/5525652787618875537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5862547309732289650&amp;postID=5525652787618875537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5525652787618875537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5862547309732289650/posts/default/5525652787618875537'/><link rel='alternate' type='text/html' href='http://trenaman.blogspot.com/2007/08/and-who-are-you-exactly.html' title='And who are you, exactly?'/><author><name>Ade</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_PAIXbU4eQiw/SfAwx4WyH-I/AAAAAAAAA1E/PpFE3s3ec0g/S220/Photo+1.jpg'/></author><thr:total>0</thr:total></entry></feed>
