The rss: component is used for polling RSS feeds. FUSE Mediation Router will default poll the feed every 60th seconds.
Note: The component currently only supports polling (consuming) feeds.
New in FUSE Mediation Router 2.0
Property | Default | Description |
---|---|---|
splitEntries | true | If true FUSE Mediation Router will poll the feed and for the subsequent polls return each entry poll by poll. If the feed contains 7 entries then FUSE Mediation Router will return the first entry on the first poll, the 2nd entry on the next poll, until no more entries where as FUSE Mediation Router will do a new update on the feed. If false then FUSE Mediation Router will poll a fresh feed on every invocation. |
filter | true | Is only used by the split entries to filter the entries to return. FUSE Mediation Router 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 . |
feedHeader | true | Sets whether to add the ROME SyndFeed 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 | true to use fixed delay between pools, otherwise fixed rate is used. See ScheduledExecutorService in JDK for details. |
FUSE Mediation Router will set the in body on the returned Exchange with a ROME SyndFeed. Depending on the splitEntries flag FUSE Mediation Router will either return a SyndFeed with one SyndEntry or a List of SyndEntrys.
Option | Value | Behavior |
---|---|---|
splitEntries | true | Only a single entry from the currently being processed feed is set in the new exchange feed. |
splitEntries | false | The entires list of entries from the feed is set in the new exchange feed. |
Header | Description |
---|---|
org.apache.camel.component.rss.feed
|
FUSE Mediation Router 1.x: The entire SyncFeed object. |
CamelRssFeed
|
FUSE Mediation Router 2.0: The entire SyncFeed object. |
The RSS component ships with an RSS dataformat that can be used to convert between String (as XML) and ROME RSS model objects.
marshal = from ROME SyndFeed to XML String
unmarshal = from XML String to ROME SyndFeed
A route using this would look something like this:
from("rss:file:src/test/data/rss20.xml?splitEntries=false&consumer.delay=1000").marshal().rss().to("mock:marshal");
The idea is to be able to use FUSE Mediation Router's lovely built in expressions for manipulating RSS messages. As shown below, an XPath expression can be used to filter the RSS message:
// only entries with Camel in the title will get through the filter from("rss:file:src/test/data/rss20.xml?splitEntries=true&consumer.delay=100") .marshal().rss().filter().xpath("//item/title[contains(.,'Camel')]").to("mock:result");
To merge multiple incoming feeds into a single feed, you can utilize a custom AggregationCollection provided with camel-rss. An example usage would look something like this:
from("rss:file:src/test/data/rss20.xml?sortEntries=true&consumer.delay=50").to("seda:temp"); from("rss:file:target/rss20.xml?sortEntries=true&consumer.delay=50").to("seda:temp"); from("seda:temp").aggregate(new AggregateRssFeedCollection()).batchTimeout(5000L).to("mock:result");
Here we use a Seda queue to gather up entries from two RSS feeds. The entries are then fed into a custom aggregator which combines these entries into a single ROME SyndFeed object.
You can filter out entries quite easily by using XPath as shown in the data format section above. You can also utilize FUSE Mediation Router's Bean Integration to implement your own conditions. For instance, a filter equivalent to the XPath example above would be:
// only entries with Camel in the title will get through the filter from("rss:file:src/test/data/rss20.xml?splitEntries=true&consumer.delay=100"). filter().method("myFilterBean", "titleContainsCamel").to("mock:result");
The custom bean for this would be
public static class FilterBean { public boolean titleContainsCamel(@Body SyndFeed feed) { SyndEntry firstEntry = (SyndEntry) feed.getEntries().get(0); return firstEntry.getTitle().contains("Camel"); } }