我创建了一个简单的Jersey客户端,它能够成功地使用有效负载执行POST请求。但现在它正在等待来自http端点的响应:
public void callEndpoint(String endpoint, String payload) {
try {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource webResource = client.resource(getBaseURI(endpoint));
log.debug("Sending payload [" + payload + "] to URL - [" + getBaseURI(endpoint) + "]");
// POST method - Is this blocking?
// Is it possible to not wait for response here
ClientResponse response = webResource.accept("application/json")
.type("application/json")
.post(ClientResponse.class, payload);
if (response.getStatus() != 200) {
log.error("The endpoint [" + getBaseURI(endpoint) + "] returned a non 200 status code [" + response.getStatus() + "] ");
}
} catch (Exception e) {
log.error("The endpoint for " + endpoint + " - " + getBaseURI(endpoint) + " is not reachable. This is the exception - " + e);
}
}
private URI getBaseURI(String endpoint) {
// Get this URI from config
String URL = "http://www.somewhere.com/v2/" + endpoint;
return UriBuilder.fromUri(URL).build();
}
问题:代码是否可能不等待响应
我试图阅读Jersey客户端文档,看看我的代码是否可以不等待响应?我看到,只有在阅读了回复后,我们才能关闭连接,但这对我来说没有用处。我希望在将负载发布到端点后立即关闭连接。
我只需要启动并忘记POST请求,因为我不关心响应。这是因为在那个端点处理需要很多时间,我不希望线程等待处理。
此外,是否可以等待某些请求的响应,而不是所有请求的响应?我可以在客户端中设置一个参数,使其等待/不等待吗?我仍在阅读java文档,所以这可能是一个非常简单的设置,但直到现在我还没能找到,所以在这里询问。谢谢
[更新]
我使用了以下代码,但当我运行java示例代码时,它会打印start&立即完成,但程序保持运行一段时间,然后退出。我猜它在等待未来的回应,所以我有可能让我的剧本不等待它吗?代码为:
public static void callEndpoint(String endpoint, String payload) {
try {
ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
AsyncWebResource webResource = client.asyncResource(getBaseURI(endpoint));
// POST method
System.out.println("start");
Future<ClientResponse> resp = webResource.accept("application/json")
.type("application/json")
.post(ClientResponse.class, payload);
// This line makes the code wait for output
//System.out.println(resp.get());
} catch (Exception e) {
System.out.println ("The endpoint for " + endpoint + " - " + getBaseURI(endpoint) + " is not reachable. This is the exception - " + e);
}
System.out.println("done");
}
我使用了一个TypeListener使其真正异步。onComplete方法将在收到响应时调用。
webResource.post(new TypeListener<ClientResponse>(ClientResponse.class) {
@Override
public void onComplete(Future<ClientResponse> f) throws InterruptedException {
try {
ClientResponse response = f.get();
if (response == null || response.getClientResponseStatus() != Status.OK) {
System.err.println(" Async " + response.getClientResponseStatus()+" "+response.getStatus());
} else{
System.out.println(" Async " + response.getClientResponseStatus()+" "+response.getStatus()+" "+response.getEntity(String.class));
}
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
我的回复有点晚,但我似乎已经解决了您的两个问题。希望它将来能帮助到别人。
我保持简短,并提供已经在这个平台上提出的问题的参考
对于第一个问题,在您不想等待的地方。您可以在其客户端对象中使用jersey提供的超时属性。以下是解决此问题的链接。如何使用Jersey 2.x设置连接和读取超时?
对于第二个问题,您可以看到它只有在运行一段时间后才会停止,这是因为客户端线程一直运行到超时。请在下面找到更好描述的链接JerseyClient异步调用似乎留下挂起的线程