Twitter4j流API因“连接超时”错误而失败

时间:2014-01-02 10:29:28

标签: streaming twitter4j

我们正在使用twitter4j来传输Twitter数据,但却出现“连接超时”错误。但是,如果我们将curl与授权信息一起使用并从同一系统执行,那么它可以正常工作,我们会收到推文。

以下是java代码片段:

ArrayList<String> track = new ArrayList<String>();
track.add("#usa");
String[] trackArray = track.toArray(new String[track.size()]);
twitterStream.filter(new FilterQuery(0, null, trackArray));

下面是堆栈跟踪,错误消息中提供的google链接没有提供太多信息。

Relevant discussions can be found on the Internet at:
    http://www.google.co.jp/search?q=944a924a or
    http://www.google.co.jp/search?q=24fd66dc
TwitterException{exceptionCode=[944a924a-24fd66dc 944a924a-24fd66b2], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
    at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:98)
    at twitter4j.TwitterStreamImpl.getFilterStream(TwitterStreamImpl.java:304)
    at twitter4j.TwitterStreamImpl$7.getStream(TwitterStreamImpl.java:292)
    at twitter4j.TwitterStreamImpl$TwitterStreamConsumer.run(TwitterStreamImpl.java:462)
Caused by: java.net.SocketTimeoutException: connect timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:310)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:176)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:163)
    at java.net.Socket.connect(Socket.java:546)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:169)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:409)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:289)
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:346)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:755)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:858)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:135)
    ... 5 more
20254 [Twitter Stream consumer-2[Establishing connection]] INFO  twitter4j.TwitterStreamImpl  - Waiting for 250 milliseconds

下面是curl命令

curl --get 'https://stream.twitter.com/1.1/statuses/filter.json' --data 'track=usa' --header 'Authorization: OAuth oauth_consumer_key="hidden_value", oauth_nonce="hidden_value", oauth_signature="hidden_value", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1388654077", oauth_token="hidden_value", oauth_version="1.0"'

我们使用代理服务器连接到互联网,并使用带有用户凭据的cntlm以及cntlm中指定的代理服务器详细信息。

2 个答案:

答案 0 :(得分:3)

问题已解决。

之前我使用下面的代码设置了代理主机和端口:

System.getProperties().put("http.proxyHost", "proxy");
System.getProperties().put("http.proxyPort", "8080");

但它的工作原理是使用ConfigurationBuilder设置代理

cb.setHttpProxyHost("proxy");
cb.setHttpProxyPort(8080);

答案 1 :(得分:0)

You can also set proxy host and port by using twitter4j properties in flume-ng command as below $ flume-ng agent -n TwitAgent -c conf -f /usr/hadoop/FLUME/apache-flume-1.3.1-bin/conf/flume.conf -Dtwitter4j.http.proxyHost=www-proxy.example.com -Dtwitter4j.http.proxyPort=80