gpt4 book ai didi

java - Jersey 中后台调用的正确处理

转载 作者:行者123 更新时间:2023-12-02 07:52:20 25 4
gpt4 key购买 nike

我必须在 Web 应用程序中对 Web 服务进行一些后台调用。电话的响应并不是真正的时间紧迫,而且对我来说几乎没有兴趣。它仅在极少数情况下发生变化,在这种情况下,我会通过抛出异常或记录失败或其他方式对其使用react。我现在的具体问题是指在 Jersey Client 2 中正确处理此类异步调用。

选项 1 使用来自 jersey 的异步调用,但随后为每个响应启动一个线程。选项 2 将立即启动一个线程并从该线程内部使用 Jersey 。

一般来说哪个选项更值得推荐?

选项1

private static final  ExecutorService executorService = Executors.newFixedThreadPool(20);

--

Client client = ClientBuilder.newClient();
WebTarget target = client.target("somehost").path("somepath");

final AsyncInvoker asyncInvoker = target.request().async();

final Future<Response> responseFuture = asyncInvoker.post(Entity.json(myjsonobject));
executorService.execute(new Worker(responseFuture));

--工作线程

  public class Worker implements Runnable {

private Future<Response> futureResponse;

public Worker(Future<Response> futureResponse){
this.futureResponse = futureResponse;
}

@Override
public void run() {
try {
final Response response = futureResponse.get();
if(response.getStatus() == 500)
doSomething();
} catch(Exception e) {
e.printStackTrace();
}
}
}

选项2

private static final  ExecutorService executorService = Executors.newFixedThreadPool(20);

--

   executorService.execute(new Worker());

--工作线程

  public class Worker implements Runnable {

public Worker(){
}

@Override
public void run() {
try {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("somehost").path("somepath");
ClientResponse response = target.request().accept(MediaType.APPLICATION_JSON).post(Entity.json(myjsonobject), ClientResponse.class);
if(response.getStatus() == 500) {
doSomething();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}

最佳答案

您可以简单地使用InvocationCallback,而不是尝试实现“非阻塞”Future.get()(使用另一个线程)。 ,将实例传递给 get 方法。例如

Future<Response> future = target.request().async().get(new InvocationCallback<Response>(){
@Override
public void completed(Response response) {
System.out.println(response.readEntity(String.class));
response.close();
client.close();
}

@Override
public void failed(Throwable throwable) { /** Log exception **/ }
});

查看更多信息 Asynchronous Client Callbacks

关于java - Jersey 中后台调用的正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29610942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com