Parameter Binding Annotations
camel-core
Annotations can be used to define an Expression or to extract various headers, properties or payloads from a Message when invoking a bean method (see Bean Integration for more detail of how to invoke bean methods) together with being useful to help disambiguate which method to invoke.
If no annotations are used then Camel assumes that a single parameter is the body of the message. Camel will then use the Type Converter mechanism to convert from the expression value to the actual type of the parameter.
The core annotations are as follows
Annotation |
Meaning |
Parameter? |
---|---|---|
To bind to an inbound message body |
|
|
To bind to an inbound message header |
String name of the header |
|
To bind to the Map of the inbound message headers |
|
|
To bind to the Map of the outbound message headers |
|
|
To bind to a named property on the exchange |
String name of hte property |
|
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 Camel will extract the value of Message.getJMSCorrelationID(), then using the Type Converter to adapt the value to the type of the parameter if required - it will inject the parameter value for the correlationID parameter. Then the payload of the message will be converted to a String and injected into the body parameter.
You don't need to use the @MessageDriven annotation; as you could use the Camel DSL to route to the beans method
Using the DSL to invoke the bean method
Here is another example which does not use POJO Consuming annotations but instead uses the DSL to route messages to the bean method
public class Foo { public void doSomething(@Header('JMSCorrelationID') String correlationID, @Body String body) { // process the inbound message here } }
The routing DSL then looks like this
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"); }