|
Page Edited :
CAMEL :
Bean Integration
Bean Integration has been edited by James Strachan (Oct 01, 2008). Content:Bean IntegrationCamel supports the integration of beans with Camel message exchanges in a number of ways. AnnotationsIf a bean is defined in Spring XML or scanned using the Spring 2.5 component scanning mechanism and a <camelContext> is used or a CamelBeanPostProcessor then we process a number of Camel annotations to do various things such as injecting resources or producing, consuming or routing messages.
Spring RemotingWe support a Spring Remoting provider which uses Camel as the underlying transport mechanism. The nice thing about this approach is we can use any of the Camel transport Components to communicate between beans. It also means we can use Content Based Router and the other Enterprise Integration Patterns in between the beans; in particular we can use Message Translator to be able to convert what the on-the-wire messages look like in addition to adding various headers and so forth. Bean ComponentThe Bean component supports the creation of a proxy via ProxyHelper Then there is a server side implementation which consumes a message and uses the Bean Binding to bind the message to invoke a method passing in its parameters. Bean bindingThe binding of a Camel Message to a bean method call can occur in different ways
By default the return value is set on the outbound message body. For example a POJO such as: public class Bar { public String doSomething(String body) { // process the in body and return whatever you want return "Bye World"; }
public class Foo { @MessageDriven(uri = "activemq:my.queue") public void doSomething(String body) { // process the inbound message here } } Here Camel with subscribe to an ActiveMQ queue, then convert the message payload to a String (so dealing with TextMessage, ObjectMessage and BytesMessage in JMS), then process this method. Using Annotations to bind parameters to the Exchange
The annotations can be used to bind in situations where traditional methods would result in ambiguous methods. So by adding annotations you can decorate your bean to help Camel invoke the correct method. You can also use the following annotations to bind parameters to different kinds of _expression_
For example: public class Foo { @MessageDriven(uri = "activemq:my.queue") public void doSomething(@Header('JMSCorrelationID') String correlationID, @Body String body) { // process the inbound message here } } In the above you can now pass the Message.getJMSCorrelationID() as a parameter to the method (using the Type Converter to adapt the value to the type of the parameter). Finally you don't need the @MessageDriven annotation; as the Camel route could describe which method to invoke. e.g. a route could look like from("activemq:someQueue"). to("bean:myBean"); Here myBean would be looked up in the Registry (such as JNDI or the Spring ApplicationContext), then the body of the message would be used to try figure out what method to call. If you want to be explicit you can use from("activemq:someQueue"). to("bean:myBean?methodName=doSomething"); And here we have a nifty example for you to show some great power in Camel. You can mix and match the annotations with the normal parameters, so we can have this example with annotations and the Exchange also: public void doSomething(@Header(name = "user") String user, @Body String body, Exchange exchange) { exchange.getIn().setBody(body + "MyBean"); } Using _expression_ LanguagesYou can also use any of the Languages supported in Camel to bind expressions to method parameters when using bean integration. For example you can use any of these annotations:
For example: public class Foo { @MessageDriven(uri = "activemq:my.queue") public void doSomething(@XPath("/foo/bar/text()") String correlationID, @Body String body) { // process the inbound message here } } Advanced example using @BeanAnd an example of using the the @Bean public class Foo { @MessageDriven(uri = "activemq:my.queue") public void doSomething(@Bean("myCorrelationIdGenerator") String correlationID, @Body String body) { // process the inbound message here } } And then we can have a spring bean with the id myCorrelationIdGenerator where we can compute the id. public class MyIdGenerator { private UserManager userManager; public String generate(@Header(name = "user") String user, @Body String payload) throws Exception { User user = userManager.lookupUser(user); String userId = user.getPrimaryId(); String id = userId + generateHashCodeForPayload(payload); return id; } } The POJO MyIdGenerator has one public method that accepts two parameters. However we have also annotated this one with the @Header and @Body annotation to help Camel know what to bind here from the Message from the Exchange being processed. Of course this could be simplified a lot if you for instance just have a simple id generator. But we wanted to demonstrate that you can use the Bean Binding annotations anywhere. public class MySimpleIdGenerator { public static int generate() { // generate a unique id return 123; } } And finally we just need to remember to have our bean registered in the Spring Registry: <bean id="myCorrelationIdGenerator" class="com.mycompany.MyIdGenerator"/>
|
Unsubscribe or edit your notifications preferences
