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

jac*_*ind 5 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);

    }

}
Run Code Online (Sandbox Code Playgroud)

我收到了错误

   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
Run Code Online (Sandbox Code Playgroud)

但是相同的配置适用于TwitterAPI

Jon*_*han 5

Twitter 给出了您可能断开连接以下原因

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

您应该会收到有关您断开连接的原因的信息,但并非总是如此

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

我的想法是,也许您阅读数据的速度不够快-尽管我不能肯定。尝试实施onStallWarning以查看是否收到任何失速警告,例如:

@Override
public void onStallWarning(StallWarning stallWarning) {
    System.out.println(stallWarning);
}
Run Code Online (Sandbox Code Playgroud)