【问题标题】:How to send HttpPost every 5 secs如何每 5 秒发送一次 HttpPost
【发布时间】:2013-07-05 00:50:33
【问题描述】:

在 Java 中,我想每 5 秒发送一次 HttpPost 而无需等待响应。我该怎么做?

我使用以下代码:

HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
StringEntity params = new StringEntity(json.toString() + "\n");
post.addHeader("content-type", "application/json");
post.setEntity(params);
httpClient.execute(post);

Thread.sleep(5000);

httpClient.execute(post);

但它不起作用。

即使我失去了前一个连接并建立了一个新连接来发送第二个,第二个执行功能总是被阻塞。

【问题讨论】:

  • 这段代码是否在循环中?
  • 它不起作用不是诊断。 “被阻止”和“不起作用”到底是什么意思?
  • "blocked" 表示 "httpClient.execute(post)" 将一直等待数据(或响应),如果没有,它将一直被阻止,它不起作用意味着 -- 如果我像这样运行我的程序,我会得到异常:java.lang.IllegalStateException:BasicClientConnManager 的使用无效:连接仍然分配。确保在分配另一个连接之前释放连接。

标签: java


【解决方案1】:

你的问题留下了一堆问题,但它的基本点可以通过以下方式实现:

while(true){ //process executes infinitely. Replace with your own condition

  Thread.sleep(5000); // wait five seconds
  httpClient.execute(post); //execute your request

}

【讨论】:

  • 我想我必须在发送新请求之前释放之前的连接。但我不想使用“EntityUtils.consume(entity);”因为如果服务器没有响应,就会一直阻塞在“httpClient.execute(post)”中。
【解决方案2】:

我尝试了您的代码,但出现异常: java.lang.IllegalStateException:BasicClientConnManager 的使用无效:连接仍然分配。 确保在分配另一个连接之前释放连接。

这个异常已经登录HttpClient 4.0.1 - how to release connection?

我能够通过使用以下代码使用响应来释放连接:

public void sendMultipleRequests() throws ClientProtocolException, IOException, InterruptedException {
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost post = new HttpPost("http://www.google.com");
    HttpResponse response = httpClient.execute(post);

    HttpEntity entity = response.getEntity();
    EntityUtils.consume(entity);

    Thread.sleep(5000);

    response = httpClient.execute(post);
    entity = response.getEntity();
    EntityUtils.consume(entity);
}

【讨论】:

  • 根据您的回复,如果服务器没有向我的HttpClient发送任何响应,代码“response = httpClient.execute(post);”总会被屏蔽的吧?如果我不想被屏蔽,我该怎么办?
  • 有什么方法可以保持每 5 秒发送一次请求并忽略响应(可能没有从服务器发回给我的响应)?
【解决方案3】:

使用 DefaultHttpClient 是同步的,这意味着程序被阻塞等待响应。相反,您可以使用async-http-client 库来执行异步请求(如果您不熟悉Maven,可以从search.maven.org 下载jar 文件)。示例代码可能如下所示:

import com.ning.http.client.*; //imports

try {
        AsyncHttpClient asyncHttpClient = new AsyncHttpClient();

        while(true) {

            asyncHttpClient
                    .preparePost("http://your.url/")
                    .addParameter("postVariableName", "postVariableValue")
                    .execute(); // just execute request and ignore response

            System.out.println("Request sent");

            Thread.sleep(5000);
        }
    } catch (Exception e) {
        System.out.println("oops..." + e);
    }

【讨论】:

  • 我尝试了您的代码,但如果没有响应,下一个请求仍然会被阻止。
  • 你能发布你测试过的代码吗?和我的代码完全一样吗?我在发布之前对其进行了测试,一切正常。您如何得出程序执行被阻止的结论?
猜你喜欢
  • 2013-09-10
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多