Custom RouteBuilder instance returned to camelContext.addRoutes() misses out on routeDefinitions

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Custom RouteBuilder instance returned to camelContext.addRoutes() misses out on routeDefinitions

reji.mathews
This post was updated on .
Hello Camel community!

Am currently using camel version 2.24.1.

I have a code which starts a camel context by passing an instance of RouteBuilder to it. It looks as follows.

newCamelContext.addRoutes(new MySmartRouteBuilder(flow));
newCamelContext.start();


Problem : When the application reboots initially, all the routes are successfully started and works great. But once the application is in running state, any updates to existing flows/addition of new flow (I stop the old camel context and spin up an updated one with fresh instance of MySmartRouteBuilder), camel context starts successfully but looks like none of those routes which are created get added to the camel context when .addRoutes() method is executed. Hence the log says 0 of 0 routes started when newCamelContext starts.


The implementation of MySmartRouteBuilder is as follows

package com.reji.camel.core.route;

public class MySmartRouteBuilder extends RouteBuilder {

    private static Logger logger = LoggerFactory.getLogger(MySmartRouteBuilder.class);
    private MyIntegrationDefinition myIntegrationDefinition;
    private ObjectMapper mapper = new ObjectMapper();
    private RouteDefinition routeDef = new RouteDefinition();

    public MySmartRouteBuilder(MyIntegrationDefinition myIntegrationDefinition) {
        super();
        this.myIntegrationDefinition = myIntegrationDefinition;
    }

    @Override
    public void configure() throws Exception {
        for(Step step : myIntegrationDefinition.steps) {
            NodeHandler nodeHandler = NodeHandlerFactory.get(step.stepType);
            routeDef = nodeHandler.handleNode(routeDef, step);
            routeDef.id(flow.id);
        }
        logger.info("Final route definition : {}", routeDef.toString());    // This one prints the routeDefinition successfully everytime and it looks fine
    }
}



NodeHandler is an interface with implementations for each type of step in MyIntegrationDefinition which analyses steps inside MyIntegrationDefinition and incrementally builds routeDef object. Sample of handler looks something like follows

package com.reji.camel.core.handlers.node;

import com.reji.camel.core.handlers.NodeHandler;
import com.reji.camel.core.handlers.NodeHandlerFactory;
import com.reji.camel.core.models.Step;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.RouteDefinition;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
@Component
public class QuartzNodeHandler extends RouteBuilder implements NodeHandler {
    private static final String NAME = "quartz";
    private static final String CRON = "cron";

    @PostConstruct
    void init() {
        NodeHandlerFactory.register(NAME, this);
    }

    @Override
    public RouteDefinition handleNode(RouteDefinition routeDefinition, Step step) throws Exception {
        String uri = String.format("quartz://apic/quartz?cron=%s", flowStep.configurations.get(CRON));
        return from(uri);
    }


    @Override
    public void configure() throws Exception {

    }
}

I can see that routeDef gets printed correctly at the logger statement inside MySmartRouteBuilder -> logger.info("Final route definition : {}", routeDef.toString()); (which says all my handlers work great!! )

While running in debug mode, I see that when the object of MySmartRouteBuilder gets returned back to newCamelContext.addRoutes(new MySmartRouteBuilder(flow)); all routeDefs are lost and there are 0 routes in there.

Any help to identify the dynamic behavior of RouteBuilder class would be very helpful! Thanks..





Adding log information for better illustration of the behavior:

First time boot when application picks up and starts successfully
=================================================================
2020-01-09 10:59:53.531 - INFO 2232 --- [main] com.reji.camel.core.route.MySmartRouteBuilder   [lineno:109]     :
2020-01-09 10:59:53.532 - INFO 2232 --- [main] com.reji.camel.core.route.MySmartRouteBuilder   [lineno:93]     : Final route definition : Route(4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log)[[From[quartz://apic/quartz?cron=0 0 11 1/1 * ? *]] -> [process[Processor@0x44641d6c], Log[Processing message], process[Processor@0x1ae924f1]]]
2020-01-09 10:59:53.535 - INFO 2232 --- [main] o.apache.camel.impl.DefaultCamelContext [lineno:3138]     : Apache Camel 2.24.1 (CamelContext: 4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log) is starting
2020-01-09 10:59:53.536 - INFO 2232 --- [main] o.apache.camel.impl.DefaultCamelContext [lineno:3307]     : Tracing is enabled on CamelContext: 4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log
2020-01-09 10:59:53.536 - INFO 2232 --- [main] o.a.c.m.ManagedManagementStrategy       [lineno:205]     : JMX is enabled
2020-01-09 10:59:53.633 - INFO 2232 --- [main] o.a.c.i.converter.DefaultTypeConverter  [lineno:66]     : Type converters loaded (core: 195, classpath: 10)
2020-01-09 10:59:53.659 - INFO 2232 --- [main] o.apache.camel.impl.DefaultCamelContext [lineno:3465]     : StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
2020-01-09 10:59:53.661 - INFO 2232 --- [main] o.apache.camel.impl.DefaultCamelContext [lineno:3186]     : Total 0 routes, of which 0 are started
2020-01-09 10:59:53.662 - INFO 2232 --- [main] o.apache.camel.impl.DefaultCamelContext [lineno:3197]     : Apache Camel 2.24.1 (CamelContext: 4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log) started in 0.127 seconds
2020-01-09 10:59:53.663 - INFO 2232 --- [main] com.reji.camel.data.source.EtcdSource [lineno:88]     : Start watching etcd
2020-01-09 10:59:53.663 - INFO 2232 --- [main] d.s.w.p.DocumentationPluginsBootstrapper[lineno:160]     : Context refreshed
2020-01-09 10:59:53.684 - INFO 2232 --- [main] d.s.w.p.DocumentationPluginsBootstrapper[lineno:163]     : Found 1 custom documentation plugin(s)
2020-01-09 10:59:53.720 - INFO 2232 --- [main] s.d.s.w.s.ApiListingReferenceScanner    [lineno:41]     : Scanning for api listing references
2020-01-09 10:59:53.862 - INFO 2232 --- [main] o.a.camel.spring.boot.RoutesCollector   [lineno:297]     : Loading additional Camel XML routes from: classpath:camel/*.xml
2020-01-09 10:59:53.863 - INFO 2232 --- [main] o.a.camel.spring.boot.RoutesCollector   [lineno:314]     : Loading additional Camel XML rests from: classpath:camel-rest/*.xml
2020-01-09 10:59:53.870 - INFO 2232 --- [main] o.a.camel.spring.SpringCamelContext     [lineno:3138]     : Apache Camel 2.24.1 (CamelContext: camel-1) is starting
2020-01-09 10:59:53.870 - INFO 2232 --- [main] o.a.c.m.ManagedManagementStrategy       [lineno:205]     : JMX is enabled
2020-01-09 10:59:53.917 - INFO 2232 --- [main] o.a.c.component.quartz.QuartzComponent  [lineno:573]     : Setting org.quartz.scheduler.jmx.export=true to ensure QuartzScheduler(s) will be enlisted in JMX.
2020-01-09 10:59:53.947 - INFO 2232 --- [main] org.quartz.impl.StdSchedulerFactory     [lineno:1179]     : Using default implementation for ThreadExecutor
2020-01-09 10:59:53.948 - INFO 2232 --- [main] org.quartz.simpl.SimpleThreadPool       [lineno:270]     : Job execution threads will use class loader of thread: main
2020-01-09 10:59:53.965 - INFO 2232 --- [main] org.quartz.core.SchedulerSignalerImpl   [lineno:60]     : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
2020-01-09 10:59:53.966 - INFO 2232 --- [main] org.quartz.core.QuartzScheduler         [lineno:229]     : Quartz Scheduler v.1.8.6 created.
2020-01-09 10:59:53.967 - INFO 2232 --- [main] org.quartz.simpl.RAMJobStore            [lineno:139]     : RAMJobStore initialized.
2020-01-09 10:59:53.974 - INFO 2232 --- [main] org.quartz.core.QuartzScheduler         [lineno:255]     : Scheduler meta-data: Quartz Scheduler (v1.8.6) 'DefaultQuartzScheduler-camel-1' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

2020-01-09 10:59:53.974 - INFO 2232 --- [main] org.quartz.impl.StdSchedulerFactory     [lineno:1324]     : Quartz scheduler 'DefaultQuartzScheduler-camel-1' initialized from an externally provided properties instance.
2020-01-09 10:59:53.974 - INFO 2232 --- [main] org.quartz.impl.StdSchedulerFactory     [lineno:1328]     : Quartz scheduler version: 1.8.6
2020-01-09 10:59:54.039 - INFO 2232 --- [main] o.a.camel.spring.SpringCamelContext     [lineno:3465]     : StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
2020-01-09 10:59:54.076 - INFO 2232 --- [main] o.a.c.component.quartz.QuartzComponent  [lineno:407]     : Starting Quartz scheduler: DefaultQuartzScheduler-camel-1
2020-01-09 10:59:54.077 - INFO 2232 --- [main] org.quartz.core.QuartzScheduler         [lineno:519]     : Scheduler DefaultQuartzScheduler-camel-1_$_NON_CLUSTERED started.
2020-01-09 10:59:54.079 - INFO 2232 --- [main] org.eclipse.jetty.server.Server         [lineno:370]     : jetty-9.4.19.v20190610; built: 2019-06-10T16:30:51.723Z; git: afcf563148970e98786327af5e07c261fda175d3; jvm 1.8.0_211-b12
2020-01-09 10:59:54.101 - INFO 2232 --- [main] o.e.jetty.server.AbstractConnector      [lineno:292]     : Started ServerConnector@66ab924{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
2020-01-09 10:59:54.102 - INFO 2232 --- [main] org.eclipse.jetty.server.Server         [lineno:410]     : Started @9430ms
2020-01-09 10:59:54.102 - INFO 2232 --- [main] c.h.camel.core.registry.ServletRegistry [lineno:60]     : Starting servlet engine on 0.0.0.0:8081/
2020-01-09 10:59:54.115 - INFO 2232 --- [main] o.a.camel.spring.SpringCamelContext     [lineno:4034]     : Route: 4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log started and consuming from: quartz://apic/quartz?cron=0+0+11+1%2F1+*+%3F+*
2020-01-09 10:59:54.115 - INFO 2232 --- [main] o.a.camel.spring.SpringCamelContext     [lineno:3186]     : Total 1 routes, of which 1 are started
2020-01-09 10:59:54.116 - INFO 2232 --- [main] o.a.camel.spring.SpringCamelContext     [lineno:3197]     : Apache Camel 2.24.1 (CamelContext: camel-1) started in 0.246 seconds
2020-01-09 10:59:54.122 - INFO 2232 --- [main] o.e.j.s.h.ContextHandler.application    [lineno:2351]     : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-01-09 10:59:54.147 - INFO 2232 --- [main] o.e.jetty.server.AbstractConnector      [lineno:292]     : Started ServerConnector@6cff61fc{HTTP/1.1,[http/1.1]}{0.0.0.0:8888}
2020-01-09 10:59:54.153 - INFO 2232 --- [main] com.reji.camel.Application            [lineno:59]     : Started Application in 8.42 seconds (JVM running for 9.481)
2020-01-09 11:00:00.018 - INFO 2232 --- [DefaultQuartzScheduler-camel-1_Worker-1] a-4c9a-a284-c6165ccd94bd-reji-quartz-log[lineno:159]     : Processing message


When doing an update on above flow and a new fresh camel context is spun up!
====================================================================

2020-01-09 11:01:01.100 - INFO 2232 --- [etcd-watch-thread] com.reji.camel.core.route.MySmartRouteBuilder   [lineno:109]     : Updating flow with new definition
2020-01-09 11:01:01.207 - INFO 2232 --- [etcd-watch-thread] com.reji.camel.core.route.MySmartRouteBuilder   [lineno:109]     :
2020-01-09 11:01:01.207 - INFO 2232 --- [etcd-watch-thread] com.reji.camel.core.route.MySmartRouteBuilder   [lineno:93]     : Final route definition : Route(4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log)[[From[quartz://apic/quartz?cron=0 0 11 1/1 * ? *]] -> [process[Processor@0x5879b493], Log[Processing message], process[Processor@0x1ae924f1]]]
2020-01-09 11:01:01.210 - INFO 2232 --- [etcd-watch-thread] o.apache.camel.impl.DefaultCamelContext [lineno:3138]     : Apache Camel 2.24.1 (CamelContext: 4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log) is starting
2020-01-09 11:01:01.210 - INFO 2232 --- [etcd-watch-thread] o.apache.camel.impl.DefaultCamelContext [lineno:3307]     : Tracing is enabled on CamelContext: 4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log
2020-01-09 11:01:01.210 - INFO 2232 --- [etcd-watch-thread] o.a.c.m.ManagedManagementStrategy       [lineno:205]     : JMX is enabled
2020-01-09 11:01:01.213 - WARN 2232 --- [etcd-watch-thread] a.c.m.DefaultManagementLifecycleStrategy[lineno:187]     : This CamelContext(4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log) will be registered using the name: 4cf19d40-72fa-4c9a-a284-c6165ccd94bd-reji-quartz-log-1 due to clash with an existing name already registered in MBeanServer.
2020-01-09 11:01:01.234 - INFO 2232 --- [etcd-watch-thread] o.a.c.i.converter.DefaultTypeConverter  [lineno:66]     : Type converters loaded (core: 195, classpath: 10)
2020-01-09 11:01:01.241 - INFO 2232 --- [etcd-watch-thread] o.apache.camel.impl.DefaultCamelContext [lineno:3465]     : StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
2020-01-09 11:01:01.242 - INFO 2232 --- [etcd-watch-thread] o.apache.camel.impl.DefaultCamelContext [lineno:3186]     : Total 0 routes, of which 0 are started
Reply | Threaded
Open this post in threaded view
|

Re: Custom RouteBuilder instance returned to camelContext.addRoutes() misses out on routeDefinitions

Willem.Jiang
Administrator
Hi Reji,

Normally common user doesn't need to care about how the RouteBuilder
is added the CamelContext, as Camel already wraps this code up.
But according to your description, it looks like you are creating a
new CamelContext and add a new customized RouteBuilder into it.
Please double check if you are adding the right RouteBuilder into a
right CamelContext.


Willem Jiang

Twitter: willemjiang
Weibo: 姜宁willem

On Thu, Jan 9, 2020 at 11:27 PM Reji Mathews <[hidden email]> wrote:

>
> Hello Camel community!
>
> Am currently using camel version 2.24.1.
>
> I have a code which starts a camel context by passing an instance of RouteBuilder to it. It looks as follows.
>
> newCamelContext.addRoutes(new MySmartRouteBuilder(flow));
> newCamelContext.start();
>
>
> Problem : When the application reboots initially, all the routes are successfully started and works great. But once the application is in running state, any updated to existing flows (I stop the old camel context and spin up an updated one with fresh instance of MySmartRouteBuilder), camel context starts successfully but looks like none of those routes which are created get added to the camel context when .addRoutes() method is executed. Hence the log says 0 of 0 routes started when newCamelContext starts.
>
>
> The implementation of MySmartRouteBuilder is as follows
>
> package com.reji.camel.core.route;
>
> public class MySmartRouteBuilder extends RouteBuilder {
>
>     private static Logger logger = LoggerFactory.getLogger(MySmartRouteBuilder.class);
>     private MyIntegrationDefinition myIntegrationDefinition;
>     private ObjectMapper mapper = new ObjectMapper();
>     private RouteDefinition routeDef = new RouteDefinition();
>
>     public MySmartRouteBuilder(MyIntegrationDefinition myIntegrationDefinition) {
>         super();
>         this.myIntegrationDefinition = myIntegrationDefinition;
>     }
>
>     @Override
>     public void configure() throws Exception {
>         for(Step step : myIntegrationDefinition.steps) {
>             NodeHandler nodeHandler = NodeHandlerFactory.get(step.stepType);
>             routeDef = nodeHandler.handleNode(routeDef, step);
>             routeDef.id(flow.id);
>         }
>         logger.info("Final route definition : {}", routeDef.toString());    // This one prints the routeDefinition successfully everytime and it looks fine
>     }
> }
>
>
>
> NodeHandler is an interface with implementations for each type of step in MyIntegrationDefinition which analyses steps inside MyIntegrationDefinition and incrementally builds routeDef object. Sample of handler looks something like follows
>
> package com.reji.camel.core.handlers.node;
>
> import com.reji.camel.core.handlers.NodeHandler;
> import com.reji.camel.core.handlers.NodeHandlerFactory;
> import com.reji.camel.core.models.Step;
> import org.apache.camel.builder.RouteBuilder;
> import org.apache.camel.model.RouteDefinition;
> import org.springframework.stereotype.Component;
>
> import javax.annotation.PostConstruct;
> @Component
> public class QuartzNodeHandler extends RouteBuilder implements NodeHandler {
>     private static final String NAME = "quartz";
>     private static final String CRON = "cron";
>
>     @PostConstruct
>     void init() {
>         NodeHandlerFactory.register(NAME, this);
>     }
>
>     @Override
>     public RouteDefinition handleNode(RouteDefinition routeDefinition, Step step) throws Exception {
>         String uri = String.format("quartz://apic/quartz?cron=%s", flowStep.configurations.get(CRON));
>         return from(uri);
>     }
>
>
>     @Override
>     public void configure() throws Exception {
>
>     }
> }
>
> I can see that routeDef gets printed correctly at the logger statement inside MySmartRouteBuilder -> logger.info("Final route definition : {}", routeDef.toString()); (which says all my handlers work great!! )
>
> While running in debug mode, I see that when the object of MySmartRouteBuilder gets returned back to newCamelContext.addRoutes(new MySmartRouteBuilder(flow)); all routeDefs are lost and there are 0 routes in there.
>
> Any help to identify the dynamic behavior of RouteBuilder class would be very helpful! Thanks..
Reply | Threaded
Open this post in threaded view
|

Re: Custom RouteBuilder instance returned to camelContext.addRoutes() misses out on routeDefinitions

contactreji
Hello William

Thanks for the quick response. I have done a quick check around your
suggestion. Everything looks good.

When the new update is triggered,  the idea is to shut down the old camel
context completely and spin up a new one. The shutting down part works
fine. Issue pops up when new camelContext is coming up.

Another observation is that if I hard code an additional route inside
MySmartRouteBuilder (using fluent api), it starts without any problem.
However, the routeDef which is incrementally built by handlers is not
getting started.

Hence I suspect it might be something around Camel's ability to pick up
custom routeDef object inside a builder class.

Any help around this would be very helpful.

Cheers
Reji



On Thu, 9 Jan 2020, 18:43 Willem Jiang, <[hidden email]> wrote:

> Hi Reji,
>
> Normally common user doesn't need to care about how the RouteBuilder
> is added the CamelContext, as Camel already wraps this code up.
> But according to your description, it looks like you are creating a
> new CamelContext and add a new customized RouteBuilder into it.
> Please double check if you are adding the right RouteBuilder into a
> right CamelContext.
>
>
> Willem Jiang
>
> Twitter: willemjiang
> Weibo: 姜宁willem
>
> On Thu, Jan 9, 2020 at 11:27 PM Reji Mathews <[hidden email]>
> wrote:
> >
> > Hello Camel community!
> >
> > Am currently using camel version 2.24.1.
> >
> > I have a code which starts a camel context by passing an instance of
> RouteBuilder to it. It looks as follows.
> >
> > newCamelContext.addRoutes(new MySmartRouteBuilder(flow));
> > newCamelContext.start();
> >
> >
> > Problem : When the application reboots initially, all the routes are
> successfully started and works great. But once the application is in
> running state, any updated to existing flows (I stop the old camel context
> and spin up an updated one with fresh instance of MySmartRouteBuilder),
> camel context starts successfully but looks like none of those routes which
> are created get added to the camel context when .addRoutes() method is
> executed. Hence the log says 0 of 0 routes started when newCamelContext
> starts.
> >
> >
> > The implementation of MySmartRouteBuilder is as follows
> >
> > package com.reji.camel.core.route;
> >
> > public class MySmartRouteBuilder extends RouteBuilder {
> >
> >     private static Logger logger =
> LoggerFactory.getLogger(MySmartRouteBuilder.class);
> >     private MyIntegrationDefinition myIntegrationDefinition;
> >     private ObjectMapper mapper = new ObjectMapper();
> >     private RouteDefinition routeDef = new RouteDefinition();
> >
> >     public MySmartRouteBuilder(MyIntegrationDefinition
> myIntegrationDefinition) {
> >         super();
> >         this.myIntegrationDefinition = myIntegrationDefinition;
> >     }
> >
> >     @Override
> >     public void configure() throws Exception {
> >         for(Step step : myIntegrationDefinition.steps) {
> >             NodeHandler nodeHandler =
> NodeHandlerFactory.get(step.stepType);
> >             routeDef = nodeHandler.handleNode(routeDef, step);
> >             routeDef.id(flow.id);
> >         }
> >         logger.info("Final route definition : {}",
> routeDef.toString());    // This one prints the routeDefinition
> successfully everytime and it looks fine
> >     }
> > }
> >
> >
> >
> > NodeHandler is an interface with implementations for each type of step
> in MyIntegrationDefinition which analyses steps inside
> MyIntegrationDefinition and incrementally builds routeDef object. Sample of
> handler looks something like follows
> >
> > package com.reji.camel.core.handlers.node;
> >
> > import com.reji.camel.core.handlers.NodeHandler;
> > import com.reji.camel.core.handlers.NodeHandlerFactory;
> > import com.reji.camel.core.models.Step;
> > import org.apache.camel.builder.RouteBuilder;
> > import org.apache.camel.model.RouteDefinition;
> > import org.springframework.stereotype.Component;
> >
> > import javax.annotation.PostConstruct;
> > @Component
> > public class QuartzNodeHandler extends RouteBuilder implements
> NodeHandler {
> >     private static final String NAME = "quartz";
> >     private static final String CRON = "cron";
> >
> >     @PostConstruct
> >     void init() {
> >         NodeHandlerFactory.register(NAME, this);
> >     }
> >
> >     @Override
> >     public RouteDefinition handleNode(RouteDefinition routeDefinition,
> Step step) throws Exception {
> >         String uri = String.format("quartz://apic/quartz?cron=%s",
> flowStep.configurations.get(CRON));
> >         return from(uri);
> >     }
> >
> >
> >     @Override
> >     public void configure() throws Exception {
> >
> >     }
> > }
> >
> > I can see that routeDef gets printed correctly at the logger statement
> inside MySmartRouteBuilder -> logger.info("Final route definition : {}",
> routeDef.toString()); (which says all my handlers work great!! )
> >
> > While running in debug mode, I see that when the object of
> MySmartRouteBuilder gets returned back to newCamelContext.addRoutes(new
> MySmartRouteBuilder(flow)); all routeDefs are lost and there are 0 routes
> in there.
> >
> > Any help to identify the dynamic behavior of RouteBuilder class would be
> very helpful! Thanks..
>
Reji Mathews
Sr. Developer - Middleware Integration / SOA ( Open Source - Apache Camel & Jboss Fuse ESB | Mule ESB )
LinkedIn - http://in.linkedin.com/pub/reji-mathews/31/9a2/40a
Twitter - reji_mathews