Polling Consumer
Camel supports implementing the Polling Consumer from the EIP patterns using the PollingConsumer interface which can be created via the Endpoint.createPollingConsumer() method.
So in your Java code you can do
Endpoint endpoint = context.getEndpoint("activemq:my.queue"); PollingConsumer consumer = endpoint.createPollingConsumer(); Exchange exchange = consumer.receive();
Notice in Camel 2.0 we have introduced the ConsumerTemplate
.
There are 3 main polling methods on PollingConsumer
Method name |
Description |
---|---|
Waits until a message is available and then returns it; potentially blocking forever |
|
Attempts to receive a message exchange, waiting up to the given timeout and returning null if no message exchange could be received within the time available |
|
Attempts to receive a message exchange immediately without waiting and returning null if a message exchange is not available yet |
ConsumerTemplate
Available as of Camel 2.0
The ConsumerTemplate
is a template much like Spring's JmsTemplate or JdbcTemplate supporting the Polling Consumer EIP. With the template you can consume Exchanges from an Endpoint.
The template supports the 3 operations above, but also including convenient methods for returning the body, etc consumeBody
.
The example from above using ConsumerTemplate is:
Exchange exchange = consumerTemplate.receive("activemq:my.queue");
Or to extract and get the body you can do:
Object body = consumerTemplate.receiveBody("activemq:my.queue");
And you can provide the body type as a parameter and have it returned as the type:
String body = consumerTemplate.receiveBody("activemq:my.queue", String.class);
You get hold of a ConsumerTemplate
from the CamelContext
with the createConsumerTemplate
operation:
ConsumerTemplate consumer = context.createConsumerTemplate();
Using ConsumerTemplate with Spring DSL
With the Spring DSL we can declare the consumer in the CamelContext, just like the ProducerTemplate. The example below illustrates this:
TODO: e1
Then we can get leverage Spring to inject the ConsumerTemplate
in our java class. The code below is part of an unit test but it shows how the consumer and producer can work together.
TODO: e1, SpringConsumerTemplateTest.java
TODO: Create a JMS sample with a timer to poll a JMS queue every 5th sec.
Scheduled Poll Components
Quite a few inbound Camel endpoints use a scheduled poll pattern to receive messages and push them through the Camel processing routes. That is to say externally from the client the endpoint appears to use an Event Driven Consumer but internally a scheduled poll is used to monitor some kind of state or resource and then fire message exchanges.
Since this a such a common pattern, polling components can extend the ScheduledPollConsumer base class which makes it simpler to implement this pattern.
There is also the Quartz Component which provides scheduled delivery of messages using the Quartz enterprise scheduler.
For more details see
- PollingConsumer
- Scheduled Polling Components
Using This Pattern
If you would like to use this EIP Pattern then please read the Getting Started, you may also find the Architecture useful particularly the description of Endpoint and URIs. Then you could try out some of the Examples first before trying this pattern out.