正确处理球衣中的后台调用
Correct handling of background calls in jersey
我必须在 Web 应用程序中对 Web 服务进行一些后台调用。电话的响应对我来说并不是真正的时间关键,也没什么意思。它只会在极少数情况下发生变化,在这种情况下,我会通过抛出异常或记录故障或其他方式对其做出反应。
我的具体问题现在指的是在 Jersey Client 2 中正确处理此类异步调用。
选项 1 使用来自 jersey 的异步调用,但随后为每个响应启动一个线程。
选项 2 将立即启动一个线程并从该线程内部使用球衣。
一般来说哪个选项更可取?
选项 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();
}
}
}
与其尝试实现 "non-blocking" Future.get()
(使用另一个线程),您可以简单地使用 InvocationCallback
,将实例传递给 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 **/ }
});
查看更多
我必须在 Web 应用程序中对 Web 服务进行一些后台调用。电话的响应对我来说并不是真正的时间关键,也没什么意思。它只会在极少数情况下发生变化,在这种情况下,我会通过抛出异常或记录故障或其他方式对其做出反应。 我的具体问题现在指的是在 Jersey Client 2 中正确处理此类异步调用。
选项 1 使用来自 jersey 的异步调用,但随后为每个响应启动一个线程。 选项 2 将立即启动一个线程并从该线程内部使用球衣。
一般来说哪个选项更可取?
选项 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();
}
}
}
与其尝试实现 "non-blocking" Future.get()
(使用另一个线程),您可以简单地使用 InvocationCallback
,将实例传递给 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 **/ }
});
查看更多