Question

I'm trying to deploy very simple ESB application to Apache ServiceMix (Fuse ESB) and all works fine up to the point where I'm trying to use 'AggregationStrategy' interface. I'm building a proof of concept using EIP and aggregator pattern in particular and cannot deploy my artifact due to NoClassDefFound Error. Looks like a typical class loading issue but I'm out of ideas on how to resolve it. I have tried both: adding and removing camel-core dependency to my service unit (servicemix-camel type).

The basis of the application can be found here. I have modified my routes definition to the following:

public void configure() {
        from("activemq:test2").split(xpath("/notes/note")).parallelProcessing().process(new NoteProcessor()).to("activemq:test3");

        from("activemq:test3").aggregate(header("id"), new MyAggregationStrategy()).completionTimeout(3000).to("activemq:test");
    }

and my custom AggregationStrategy looks like this:

package com.softwarepassion.tutorial.camel;

import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.processor.aggregate.AggregationStrategy;

public class MyAggregationStrategy implements AggregationStrategy {

    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        Message newIn = newExchange.getIn();
        String oldBody = oldExchange.getIn().getBody(String.class);
        String newBody = newIn.getBody(String.class);
        newIn.setBody(oldBody + newBody);
        return newExchange;
    }
}

I got the following error on plain ServiceMix as well as on FuseESB:

07:50:49,625 | ERROR | use-01-11/deploy | DefaultComponent
| ? ? | 151 - servicemix-common - 2011.02.1.fuse-02-11 | Error creating bean with name 'template': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'camel': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.softwarepassion.tutorial.camel.MyRouteBuilder': Resolution of declared constructors on bean Class [com.softwarepassion.tutorial.camel.MyRouteBuilder] from ClassLoader [[org.apache.xbean.classloader.JarFileClassLoader: name=org.apache.xbean.spring.context.FileSystemXmlApplicationContext@1c4d3b6 urls=[file:/home/kris/apache-servicemix-4.4.1-fuse-01-11/data/jbi/tutorial-camel-sa/sus/tutorial-camel-su/] parents=[[org.apache.xbean.classloader.JarFileClassLoader: name=SU parent class loader urls=[] parents=[231.0, BundleDelegatingClassLoader for [camel-spring (org.apache.camel.camel-spring)], BundleDelegatingClassLoader for [camel-cxf (org.apache.camel.camel-cxf)], BundleDelegatingClassLoader for [camel-cxf-transport (org.apache.camel.camel-cxf-transport)]]]]]] failed; nested exception is java.lang.NoClassDefFoundError: org/apache/camel/processor/aggregate/AggregationStrategy 07:50:49,627 | ERROR | use-01-11/deploy | ServiceAssemblyInstaller | ?
? | 147 - org.apache.servicemix.jbi.deployer - 1.5.1.fuse-01-11 | Error deploying SU tutorial-camel-su

Was it helpful?

Solution

Do not use JBI its a legacy/dead. http://gnodet.blogspot.com/2010/12/thoughts-about-servicemix.html

Use the Camel archetypes to create a new OSGi project to be deployed in ServiceMix. The list of archetypes is here http://camel.apache.org/camel-maven-archetypes.html

For example the camel-archetype-spring-dm or camel-archetype-blueprint

OTHER TIPS

For anyone looking for a solution to the above problem, I have finally found here, that I should switch to OSGI type of deployment. You can find working camel-osgi example project inside 'examples' directory at the root of your FuseESB installation.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top