今回は実装編、つまりTwitter4JとDroolsの使い方です。さて、コードを見ていきましょう。
TwitterCBR.java
// Creates a knowledge base final KnowledgeBase kbase = createKnowledgeBase( "twitterRules1.drl" ); // Creates a knowledge session final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); // Gets the stream entry point final WorkingMemoryEntryPoint ep = ksession.getWorkingMemoryEntryPoint( "twitter" );
まず、Droolsのセットアップです。ルール定義(DRLファイル)を読み込んでナレッジベース(KnowledgeBase)を作成し、ナレッジベースから セッション(StatefulKnowledgeSession)を生成します。このセッションが処理の中心になります。
続いてセッションから"twitter"という名前でエントリポイント(WorkingMemoryEntryPoint)を作成します。エントリポイントはデータ(Event)を流し込むための入り口です。
Droolsが初めての人にはあまり気にならない所だと思いますが、Droolsには2種類の使い方があって、
1. セッションに直接データ(Fact)を渡して、一度にバッチ処理
2. エントリポイント経由でデータ(Event)を渡して、逐次処理
が選択できます。
今回は「なんかリアルタイムな感じのもの」と題して、後者、時間の概念を持ったイベント処理(Complex Event Processing)を行います。
// Connects to the twitter stream and register the listener new Thread( new Runnable() { @Override public void run() { StatusListener listener = new TwitterStatusListener( ep ); TwitterStream twitterStream = new TwitterStreamFactory().getInstance(); twitterStream.addListener( listener ); twitterStream.sample(); } } ).start();
別スレッドでTwitter4Jを使ってエントリポイントにtweetを流し込みます。簡単ですね!
TwitterStream.sample()は世界中のTweetからランダムにTweetを返してくれます。全Tweetを頂くには Twitter, Inc.と契約が必要らしいです。でも、お高いんでしょう?
// Starts to fire rules in Drools Fusion
ksession.fireUntilHalt();
StatefulKnowledgeSession.fireUntilHalt() を呼び出すと、セッションはエントリポイントから与えられたデータを処理し続けます。スレッドはブロックされるので、適当にCtrl+Cしてください。
その3ではいよいよルールを見ていきます。