Binding Annotations has been edited by James Strachan (Oct 01, 2008).

(View changes)

Content:

Using Annotations to bind parameters to the Exchange

Bean component

The annotations below is part of camel-core and its Bean component and thus does not require camel-spring. These annotations is to be used with the Bean component.

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_

Annotation Meaning
@Body To bind to an inbound message body
@Header To bind to an inbound message header
@Headers To bind to the Map of the inbound message headers
@OutHeaders To bind to the Map of the outbound message headers
@Property To bind to a named property on the exchange
@Properties To bind to the property map on the exchange

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_ Languages

You 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:

Annotation Description
@Bean Inject a Bean _expression_
@BeanShell Inject a BeanShell _expression_
@Constant Inject a Constant _expression_
@EL Inject an EL _expression_
@Groovy Inject a Groovy _expression_
@Header Inject a Header _expression_
@_javascript_ Inject a _javascript_ _expression_
@OGNL Inject an OGNL _expression_
@PHP Inject a PHP _expression_
@Python Inject a Python _expression_
@Ruby Inject a Ruby _expression_
@Simple Inject an Simple _expression_
@XPath Inject an XPath _expression_
@XQuery Inject an XQuery _expression_

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 @Bean

And an example of using the the @Bean binding annotation, where you can use a POJO where you can do whatever java code you like:

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"/>

Reply via email to