POJO producing
There are two different ways to send messages to any Camel Endpoint from a POJO:
-
Using
@Produce
or@EndpointInject
-
Or to hide using an interface
The following steps use the ActiveMQ component which is not yet supported on Camel 4. |
Using @Produce
To allow sending of messages from POJOs you can use the @Produce
annotation.
This will inject a org.apache.camel.ProducerTemplate
so that the bean can send messages.
The @Produce POJO annotations are not part of any Camel routes, and you cannot use errorHandler or onException with that.
|
For example to send a message to the foo queue on ActiveMQ:
public class Foo {
@Produce("activemq:foo")
ProducerTemplate producer;
public void doSomething() {
if (whatever) {
producer.sendBody("<hello>world!</hello>");
}
}
}
The downside of this is that your code is now dependent on a Camel API,
the ProducerTemplate
. The next section describes how to remove this
dependency.
See POJO Consuming for how to use a property
on the bean as endpoint configuration, e.g., using the property
attribute on @Produce or @EndpointInject .
|
Hiding the Camel APIs From Your Code
You can hide Camel APIs from your application code.
You can add the @Produce
annotation to an injection
point (a field or property setter) using some interface
you use in your business logic. Example:
public interface MyListener {
// this method is request/reply (InOut) because the method has a return value
// to use one way (InOnly) then the method should be a void method
String sayHello(String name);
}
public class MyBean {
@Produce("activemq:foo")
protected MyListener producer;
public void doSomething() {
// lets send a message and get a response back
String response = producer.sayHello("James");
}
}
Here Camel will automatically inject a smart client side proxy at
the @Produce
annotation - an instance of the MyListener
interface.
When we invoke methods on this interface the method call is
turned into an object and is sent to the
endpoint; in this case the ActiveMQ endpoint to
queue foo
. Because the sayHello
method has a return type (String
) then Camel
will use Request Reply (InOut) messaging.
public interface MyListener {
void sayHello(String name);
}
If the method is a void
method, then Camel will use Event Message (InOnly) messaging.