【问题标题】:how to stop and kill the Twitter4j stream correctly如何正确停止和终止 Twitter4j 流
【发布时间】:2013-05-29 13:50:00
【问题描述】:

我尝试使用 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 ?

谢谢!

【问题讨论】:

    标签: streaming twitter4j


    【解决方案1】:

    解决方案如下:

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

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

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

    【讨论】:

    • 如果有人偶然发现这篇文章,请注意:如果您使用身份验证,则必须通过 twitter4j.properties 文件配置 twitter4j,因为 getSingleton() 不接受 ConfigurationBuilder
    【解决方案2】:

    我也遇到过类似的问题。上述任何解决方案仍然不起作用,所以我做了一个解决方法,将 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 ) ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多