RSS フィードからの更新をチェックするポーリング サービスを Java で構築しようとしています。
新しいアイテムを検出すると、システム内の新しいアイテムのみを送信する必要があります。
これを行う API はありますか、それとも比較チェックを自分で行う必要がありますか?
現時点では、私のポーラーは、システムで重複を引き起こしていると現在認識しているものを返すだけです。
RSS フィードからの更新をチェックするポーリング サービスを Java で構築しようとしています。
新しいアイテムを検出すると、システム内の新しいアイテムのみを送信する必要があります。
これを行う API はありますか、それとも比較チェックを自分で行う必要がありますか?
現時点では、私のポーラーは、システムで重複を引き起こしていると現在認識しているものを返すだけです。
Sun には、フィードを作成するために構築された RSS ユーティリティ ライブラリがあります。ただし、同様のことを行うために使用している便利な RSS パーサーも含まれています。
ここからライブラリをダウンロードできます (パーサーの詳細については、一番下までスクロールしてください)。
http://java.sun.com/developer/technicalArticles/javaserverpages/rss_utilities/
新しいアイテムを確認するには、GUID を取得して既存のアイテムの GUID と比較します。
// Create an RSS Parser
RssParser parser = RssParserFactory.createDefault();
// Parse the feed
Rss rss = parser.parse( new URL( YOUR_FEED ) );
// Get the channel
Channel channel = rss.getChannel();
// Get the items
Collection<Item> items = channel.getItems();
// Loop for each item
for ( Item item : items )
{
// Get the GUID
Guid guid = item.getGuid();
// Loop for each of the previously seen GUIDs and compare
}
必要なものと同様のものを Informa で利用可能
「ポーラーモジュールは、チャネル変更のバックグラウンドポーリングに便利なサービスを提供することを目的としています」
さて、私はJavaが初めてです...しかし、ここに私が試してうまく動作する簡単なコードがあります。特定の Web サイトから RSS を読み取る代わりに、ローカル ディレクトリから RSS を読み取ります。http://informa.sourceforge.net/で入手可能な Informa API を使用します。
public class Read_UpdateRSS implements de.nava.informa.utils.poller.PollerObserverIF {
public static void main(String[] args) {
try {
File in = new File("/home/RSSFeed/rssfeed.xml");
ChannelBuilder build = new ChannelBuilder();
Channel channel = (Channel) FeedParser.parse(build,in);
System.out.println("Description:" + channel.getDescription());
System.out.println("Title:" + channel.getTitle());
// Magic of polling starts here. polling is done every 10 minutes
Poller poll = new Poller();
PollerObserverIF observer = new Read_UpdateRSS();
poll.addObserver(observer);
poll.registerChannel(channel, 10 * 60 * 1000);
for(Object x: channel.getItems()){
Item anItem = (Item) x;
System.out.println(anItem.getTitle() + "-");
System.out.println(anItem.getDescription());
}
} catch (Exception e) {
}
}
@Override
public void channelChanged(ChannelIF arg0) {}
@Override
public void channelErrored(ChannelIF arg0, Exception arg1) {}
@Override
public void itemFound(ItemIF item, ChannelIF channel) {
System.out.println("new item found");
channel.addItem(item);
}
@Override
public void pollFinished(ChannelIF channel) {
System.out.println("Finished polling with " + channel.getItems().size() + " items in the channel");
}
@Override
public void pollStarted(ChannelIF channel) {
System.out.println("Started polling with " + channel.getItems().size() + " items in the channel");
}
}