如何正确停止和杀死Twitter4j流

时间:2013-06-03 12:02:06

标签: streaming twitter4j

我尝试使用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()在控制台中打印状态。

然后我在另一个servlet类中创建一个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(...);

就好像我刚刚恢复了之前的m_twitterstream并添加了一个监听器。所以每张推文都有两个印刷品......

如何完全杀死Stream?当我重新启动它时,怎么只有最后一个StatusListener?

谢谢!

2 个答案:

答案 0 :(得分:1)

以下是解决方案:

方法TwitterStreamFactory.getSingleton()返回TwitterStream的相同实例。

即使您正确删除了您的TwitterStream对象,侦听器也会存储在您的TwitterStream Singleton配置中......所以您必须使用以下命令创建TwitterStream对象的不同实例:

TwitterStreamFactory l_Twitterfactory = new TwitterStreamFactory();
m_twitterstream = l_Twitterfactory.getInstance();

答案 1 :(得分: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 ) ;