Twitter4JとDroolsでなんかリアルタイムな感じのもの その2 実装編

今回は実装編、つまり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ではいよいよルールを見ていきます。