在twitter4j中流关闭错误如何解决

时间:2013-06-27 05:42:16

标签: java credentials twitter4j

它说Stream Closed错误

public class StreamAPI {

    public static void main(String[] args) {


        ConfigurationBuilder cb = new ConfigurationBuilder();
        cb.setDebugEnabled(true);
        cb.setOAuthConsumerKey("xxxx");
        cb.setOAuthConsumerSecret("xxx");
        cb.setOAuthAccessToken("xx-xx");
        cb.setOAuthAccessTokenSecret("xxx");
        cb.setUseSSL(true);
        cb.setUserStreamRepliesAllEnabled(true);


        TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance();

        AccessToken accestoken = new AccessToken("xx-xx", "xxx");

        twitterStream.setOAuthAccessToken(accestoken);
        StatusListener listener = new StatusListener() {

            public void onStatus(Status status) {
                System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText());
            }

            public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
                System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId());
            }

            public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
                System.out.println("Got track limitation notice:" + numberOfLimitedStatuses);
            }

            public void onScrubGeo(long userId, long upToStatusId) {
                System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId);
            }

            @Override
            public void onStallWarning(StallWarning stallWarning) {
                //To change body of implemented methods use File | Settings | File Templates.
            }

            public void onException(Exception ex) {
                ex.printStackTrace();
            }
        };

        FilterQuery fq = new FilterQuery();
        String keywords[] = {"France", "Germany"};

        fq.track(keywords);

        twitterStream.addListener(listener);
        twitterStream.filter(fq);

    }

}

我收到错误

   Stream closed.
Relevant discussions can be found on the Internet at:
    http://www.google.co.jp/search?q=a8fd061d or
    http://www.google.co.jp/search?q=00070a0c
TwitterException{exceptionCode=[a8fd061d-00070a0c a8fd061d-0007099d], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.3}
    at twitter4j.StatusStreamBase.handleNextElement(StatusStreamBase.java:199)
    at twitter4j.StatusStreamImpl.next(StatusStreamImpl.java:57)
    at twitter4j.TwitterStreamImpl$TwitterStreamConsumer.run(TwitterStreamImpl.java:478)
Caused by: java.io.IOException: the end of the stream has been reached
    at twitter4j.StatusStreamBase.handleNextElement(StatusStreamBase.java:88)
    ... 2 more

但是相同的配置适用于TwitterAPI

1 个答案:

答案 0 :(得分:4)

Twitter提供following reasons why you may be disconnected

  
      
  • 客户端使用相同的凭据建立太多连接。发生这种情况时,将终止最旧的连接。这意味着   你必须小心不要并行运行两个重新连接的客户端   使用相同的凭据,否则他们将轮流断开连接   彼此。
  •   
  • 客户端突然停止读取数据。如果从流中读取的推文的速率突然下降,则连接将被关闭。
  •   
  • 客户端读取数据的速度太慢。每个流连接都支持   通过要发送给客户端的消息队列。如果此队列增长   随着时间的推移太大,连接将被关闭。
  •   
  • 重新启动流媒体服务器。这通常与代码部署有关,并且不常见。
  •   
  • Twitter的网络配置发生了变化。这些事件非常罕见,代表负载均衡器重启或网络   例如,重新配置。
  •   

您应该会收到为什么断开连接的信息,but not always

  

Streams可能因各种原因而关闭。流API将尝试传递一条消息,指示流已关闭的原因。请注意,如果断开连接是由于网络问题或客户端读取速度太慢,则可能无法收到此消息。

我的想法是,也许你没有足够快地读取数据 - 尽管我不能肯定地说。尝试实施onStallWarning以查看是否有任何失速警告,例如:

@Override
public void onStallWarning(StallWarning stallWarning) {
    System.out.println(stallWarning);
}