Atom Component
The atom: component is used for polling atom feeds.
Camel will default poll the feed every 60th seconds.
Note: The component currently only supports polling (consuming) feeds.
Maven users will need to add the following dependency to their pom.xml for this component:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-atom</artifactId>
<version>x.x.x</version>
</dependency>
URI format
Where atomUri is the URI to the atom feed to poll.
Options
Property |
Default |
Description |
splitEntries |
true |
If true Camel will poll the feed and for the subsequent polls return each entry poll by poll. If the feed contains 7 entries then Camel will return the first entry on the first poll, the 2nd entry on the next poll, until no more entries where as Camel will do a new update on the feed. If false then Camel will poll a fresh feed on every invocation. |
filter |
true |
Is only used by the split entries to filter the entries to return. Camel will default use the UpdateDateFilter that only return new entries from the feed. So the client consuming from the feed never receives the same entry more than once. The filter will return the entries ordered by the newest last. |
lastUpdate |
null |
Is only used by the filter, as the starting timestamp for selection never entries (uses the entry.updated timestamp). Syntax format is: yyyy-MM-ddTHH:MM:ss. Example: 2007-12-24T17:45:59. |
throttleEntries |
true |
Camel 2.5: Sets whether all entries identified in a single feed poll should be delivered immediately. If true, only one entry is processed per consumer.delay. Only applicable when splitEntries is set to true. |
feedHeader |
true |
Sets whether to add the Abdera Feed object as a header. |
sortEntries |
false |
If splitEntries is true, this sets whether to sort those entries by updated date. |
consumer.delay |
60000 |
Delay in millis between each poll. |
consumer.initialDelay |
1000 |
Millis before polling starts. |
consumer.userFixedDelay |
false |
If true, use fixed delay between pools, otherwise fixed rate is used. See ScheduledExecutorService in JDK for details. |
You can append query options to the URI in the following format, ?option=value&option=value&...
Exchange data format
Camel will set the In body on the returned Exchange with the entries. Depending on the splitEntries flag Camel will either return one Entry or a List<Entry>.
Option |
Value |
Behavior |
splitEntries |
true |
Only a single entry from the currently being processed feed is set: exchange.in.body(Entry) |
splitEntries |
false |
The entire list of entries from the feed is set: exchange.in.body(List<Entry>) |
Camel can set the Feed object on the In header (see feedHeader option to disable this):
Message Headers
Camel atom uses these headers.
Header |
Description |
org.apache.camel.component.atom.feed |
Camel 1.x: When consuming the org.apache.abdera.model.Feed object is set to this header. |
CamelAtomFeed |
Camel 2.0: When consuming the org.apache.abdera.model.Feed object is set to this header. |
Samples
In this sample we poll James Strachan's blog.
from("atom:).to("seda:feeds");
In this sample we want to filter only good blogs we like to a SEDA queue. The sample also shows how to setup Camel standalone, not running in any Container or using Spring.
private CamelContext context;
@Override
protected CamelContext createCamelContext() throws Exception {
SimpleRegistry registry = new SimpleRegistry();
registry.put("blogService", new BlogService());
context = new DefaultCamelContext(registry);
context.addRoutes(createRouteBuilder());
context.start();
return context;
}
/**
* This is the route builder where we create our routes in the advanced Camel DSL syntax
*/
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
public void configure() throws Exception {
from("atom:file:src/test/data/feed.atom?splitEntries=true&consumer.delay=1000").to("seda:feeds");
from("seda:feeds").filter().method("blogService", "isGoodBlog").to("seda:goodBlogs");
from("seda:goodBlogs").to("mock:result");
}
};
}
/**
* This is the actual junit test method that does the assertion that our routes is working
* as expected
*/
@Test
public void testFiltering() throws Exception {
MockEndpoint mock = context.getEndpoint("mock:result", MockEndpoint.class);
mock.expectedMinimumMessageCount(2);
mock.assertIsSatisfied();
}
/**
* Services for blogs
*/
public class BlogService {
/**
* Tests the blogs if its a good blog entry or not
*/
public boolean isGoodBlog(Exchange exchange) {
Entry entry = exchange.getIn().getBody(Entry.class);
String title = entry.getTitle();
boolean good = title.toLowerCase().contains("camel");
return good;
}
}
See Also