2013-06-03 46 views
1

我嘗試使用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一個監聽器添加。所以我有兩個打印每個鳴叫...

如何完全殺死流?當我重新啓動時,只有最後一個StatusListener?

謝謝!

回答

1

這裏的解決方案:

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

即使你正確刪除TwitterStream對象,聽衆都存儲在您的TwitterStream辛格爾頓配置......所以,你必須創建型動物與TwitterStream對象的實例:

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

如果有人在這個職位失蹄的說明:如果您使用的身份驗證,則必須通過twitter4j.properties文件來配置twitter4j,因爲getSingleton()不接受ConfigurationBuilder – alextsil

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) ;