【问题标题】:Correct handling of background calls in jersey正确处理球衣中的后台呼叫
【发布时间】:2023-03-26 07:56:01
【问题描述】:

我必须对 Web 应用程序中的 Web 服务进行一些后台调用。电话的响应并不是真正的时间关键,对我来说几乎没有兴趣。它仅在极少数情况下发生变化,在这种情况下,我会通过抛出异常或记录失败等来对其做出反应。 我现在的具体问题是指在 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();
          }
     }
 }

【问题讨论】:

    标签: java multithreading jax-rs jersey-2.0 jersey-client


    【解决方案1】:

    您可以简单地使用InvocationCallback,将实例传递给get 方法,而不是尝试实现“非阻塞”Future.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查看更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2016-01-03
      相关资源
      最近更新 更多