|
Page Edited :
CAMEL :
Spring Remoting
Spring Remoting has been edited by James Strachan (Aug 11, 2008). Content:Spring RemotingWe support Spring Remoting 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. Using Camel Spring RemotingIn your Spring XML just use the CamelProxyFactoryBean Then to implement the service you use CamelServiceExporter The following example <!-- Creates a proxy to the direct:say endpoint. --> <bean id="sayProxy" class="org.apache.camel.spring.remoting.CamelProxyFactoryBean"> <property name="serviceUrl" value="direct:say"/> <property name="serviceInterface" value="org.apache.camel.spring.remoting.ISay"/> </bean>
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"; } Or the Exchange example. Notice that the return type must be void: public class Bar { public void doSomething(Exchange exchange) { // process the exchange exchange.getIn().setBody("Bye World"); } For example you could write a method like this (showing also a feature in Camel, the @MessageDrive annotation): 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 ExchangeThe 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(@Path("/foo/bar/text()") String correlationID, @Body String body) { // process the inbound message here } } |
Unsubscribe or edit your notifications preferences
