Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

The core annotations are as follows

Annotation

Meaning

Parameter

@Body

To bind to an inbound message body

 

@ExchangeException

To bind to an Exception set on the exchange

 

@Header

To bind to an inbound message header

String name of the 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

String name of the property

@Properties

To bind to the property map on the exchange

 

@Handler

Not part as a type parameter but stated in this table anyway to spread the good word that we have this annotation in Camel now. See more at Bean Binding.

 

The follow annotations @Headers, @OutHeaders and @Properties binds to the backing java.util.Map so you can alter the content of these maps directly, for instance using the put method to add a new entry. See the OrderService class at Exception Clause for such an example. You can use @Header("myHeader") and @Property("myProperty") to access the backing java.util.Map.

Example

In this example below we have a @Consume consumer (like message driven) that consumes JMS messages from the activemq queue. We use the @Header and @Body parameter binding annotations to bind from the JMSMessage to the method parameters.For example:

Code Block
public class Foo {
	
    @MessageDriven@Consume(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 Camel will extract the value of Message.getJMSCorrelationID() as a parameter to the method (, 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 parameter). correlationID parameter. Then the payload of the message will be converted to a String and injected into the body parameter.

You Finally you don't necessarily need to use the @MessageDriven annotation; as the Camel route could describe which method to invoke.@Consume annotation if you don't want to as you could also make use of the Camel DSL to route to the bean's method as well.

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

Code Block

public class Foo {
    public void doSomething(@Header("JMSCorrelationID") String correlationID, @Body String body) {
		// process the inbound message here
    }

}

The routing DSL then looks like thise.g. a route could look like

Code Block
from("activemq:someQueue").
  to("bean:myBean");

...

Code Block
    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:

Code Block

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:

Code Block

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;
   }
}
Include Page
Annotation Based Expression Language
Annotation Based Expression Language

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:

...