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然后我在另一个 servlet 类中创建一个对象:

@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 ?

谢谢 !

4

2 回答 2

1

这是解决方案:

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

即使您正确删除了 TwitterStream 对象,侦听器也会存储在您的 TwitterStream Singleton 配置中...因此您必须使用以下命令创建 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 回答