1

Twitter4j ストリーミング機能を使用しようとしています。したがって、私の実装は次のクラスにあります。

public class TweetsStream {

    private TwitterStream m_twitterstream;
    private StatusListener m_statusListener;

    public void printStream(...)

        // Stream
        m_twitterstream = null;
        m_twitterstream = TwitterStreamFactory.getSingleton();

        // Listener
        m_statusListener = new StatusListenerRedefined(...);
        m_twitterstream.addListener(m_statusListener);

        // Filter
        FilterQuery l_filter = new FilterQuery();
        l_filter.track(... );

        // Launch
        m_twitterstream.filter(l_filter);
    }

    public void stopStream(){

        m_twitterstream.shutdown();
        m_logger.info("shutdown done");

        m_twitterstream = null;
        m_statusListener = null;
    }
}

私の新しい StatusListener() は、コンソールにステータスを出力します。

次にTweetsStream、別のサーブレット クラスでオブジェクトを作成します。

@WebServlet("/Controler")
public class Controler extends HttpServlet {

    private static final long serialVersionUID = 1L;

    // Logger
    protected final static Logger m_logger = Logger.getLogger("Controler");

    //Stream    
    private TweetsStream m_tweetStream;



    //Function...
    m_tweetStream = new TweetsStream(...);
    m_tweetStream.printStream(...);

}

ストリームは完全に機能します。だから私は今それを止めようとしています。同じクラスで私は関数を持っています:

private void stopStream(){
 m_tweetStream.stopStream();
 m_tweetStream = null;
}

ストリームはコンソールで停止します。すべて問題ありません。

しかし、同じクラスで私の機能を思い出すと:

    //Function...
    m_tweetStream = new TweetsStream(...);
    m_tweetStream.printStream(...);

リスナーを 1 つ追加して、以前の m_twitterstream を再開しただけのようです。だから私は各ツイートの2つの印刷物を持っています...

Stream を完全に殺す方法は? そして、再起動すると、最後の StatusListener しかありませんか?

ありがとう !

4

2 に答える 2

1

解決策は次のとおりです。

このメソッドTwitterStreamFactory.getSingleton()は、TwitterStream の同じインスタンスを返します。

TwitterStream オブジェクトを適切に削除しても、リスナーは TwitterStream シングルトン構成に保存されます...したがって、次のように TwitterStream オブジェクトのさまざまなインスタンスを作成する必要があります。

TwitterStreamFactory l_Twitterfactory = new TwitterStreamFactory();
m_twitterstream = l_Twitterfactory.getInstance();
于 2013-06-03T14:13:40.367 に答える
0

私は同様の問題に直面しました。それでも上記の解決策のいずれかが機能しないため、これを回避して twitterStream オブジェクトをマップに保存しました。そのため、後でストリームを閉じる必要があるときに同じオブジェクトを取得できます。

            ProfileEntity profileEntity = profileRepository.findBySocialId( twitterId+"" ) ;
            ConfigurationBuilder cb = new ConfigurationBuilder();
            cb.setDebugEnabled(true);
            cb.setOAuthConsumerKey( twitterCustomerKey );
            cb.setOAuthConsumerSecret( twitterCustomerSecret );
            cb.setOAuthAccessToken( profileEntity.getAccessToken() ) ; 
            cb.setOAuthAccessTokenSecret( profileEntity.getAccessTokenSecret() ) ; 
            twitterStream =  new TwitterStreamFactory(cb.build()).getInstance();
          twitterStreamMap.put( twitterId , twitterStream ) ;
于 2016-08-23T19:22:25.380 に答える