@MessageDriven or @Consume

@MessageDriven is @deprecated
@MessageDriven is deprecated in Camel 1.x. You should use @Consume instead. Its removed in Camel 2.0.

To consume a message you use either the @MessageDriven annotation or from 1.5.0 the @Consume annotation to mark a particular method of a bean as being a consumer method. The uri of the annotation defines the Camel Endpoint to consume from.

e.g. lets invoke the onCheese() method with the String body of the inbound JMS message from ActiveMQ on the cheese queue; this will use the Type Converter to convert the JMS ObjectMessage or BytesMessage to a String - or just use a TextMessage from JMS

public class Foo {

  @Consume(uri="activemq:cheese")
  public void onCheese(String name) {
    ...
  }
}

The Bean Binding is then used to convert the inbound Message to the parameter list used to invoke the method .

What this does is basically create a route that looks kinda like this

from(uri).bean(theBean, "methodName");
When using more than one CamelContext
When you use more than 1 CamelContext you might end up with each of them creating a POJO Consuming.
In Camel 2.0 there is a new option on @Consume that allows you to specify which CamelContext id/name you want it to apply for.

Using context option to apply only a certain CamelContext

Available as of Camel 2.0
See the warning above.

You can use the context option to specify which CamelContext the consumer should only apply for. For example:

  @Consume(uri="activemq:cheese", context="camel-1")
  public void onCheese(String name) {

The consumer above will only be created for the CamelContext that have the context id = camel-1. You set this id in the XML tag:

<camelContext id="camel-1" ...>

Using an explicit route

If you want to invoke a bean method from many different endpoints or within different complex routes in different circumstances you can just use the normal routing DSL or the Spring XML configuration file.

For example

from(uri).beanRef("myBean", "methodName");

which will then look up in the Registry and find the bean and invoke the given bean name. (You can omit the method name and have Camel figure out the right method based on the method annotations and body type).

Use the Bean endpoint

You can always use the bean endpoint

from(uri).to("bean:myBean?method=methodName");

Which approach to use?

Using the @MessageDriven/@Consume annotations are simpler when you are creating a simple route with a single well defined input URI.

However if you require more complex routes or the same bean method needs to be invoked from many places then please use the routing DSL as shown above.

© 2004-2011 The Apache Software Foundation.
Apache Camel, Camel, Apache, the Apache feather logo, and the Apache Camel project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.
Graphic Design By Hiram