我尝试使用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?
谢谢!
答案 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 ) ;