2016-01-27 4 views
0

Я хочу поддерживать синхронный и асинхронный вызов с использованием RESTEasy-JAXRS. И мой асинхронный вызов должен быть основан на обратном вызове, где запрос Async будет иметь callbackURI, запрос обрабатывается асинхронно и по завершении делает вызов callbackURI с состоянием/результатом операции. Может кто-то указать мне, чтобы исправить место? Я вижу много о модели опроса, но не обратный вызов с RESTEasy.RESTEasy + Асинхронный + метод обратного вызова + Java

Я новичок в асинхронные вещи ...

Заранее спасибо!

Спасибо за ваш отзыв rmlan.Yes, но у нас есть поддержка в JAX-RS для обработки асинхронной работы с использованием @Suspended & AsyncResponse. Я сделал это со следующим кодом, но я не могу найти способ сделать обратный вызов для Клиента, который вызвал API после завершения задачи с этим запросом.

@GET 
@Path("/async") 
public String checkAsync(@Suspended final AsyncResponse response) { 
    response.setTimeoutHandler(new TimeoutHandler() { 

     @Override 
     public void handleTimeout(AsyncResponse asyncResponse) { 
      response.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE) 
        .entity("Operation time out.").build()); 
     } 
    }); 
    response.setTimeout(2, TimeUnit.SECONDS); 

    new Thread(new Runnable() { 
      @Override 
      public void run() { 
       String result = veryExpensiveOperation(); 
       response.resume(result); 
      } 

      private String veryExpensiveOperation() { 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       logger.debug("Task is processed fully"); 
       return "Successful"; 
      } 
     }).start(); 

    return "nothing"; 
} 
+1

Как клиент обрабатывает вызов и ответ на ваш сервис Resteasy действительно не имеет ничего общего с Resteasy. Независимо от того, будет ли выполнять асинхронный вызов, он будет полностью связан с клиентом. – rmlan

+0

Спасибо за ваш отзыв rmlan !. Я добавил свой код выше. Не могли бы вы рассказать мне кое-что? – Mohan

ответ

0

Каждый метод в классе имеет один возврат (или может быть аннулирован). но иногда вам нужны обратные вызовы из вашего метода. это решение.

public abstract class MyClass { 

    public abstract void myCallbackMethod(); 

    public void myMethod(){ 

     for (int i = 0; i < 5; i++) { 
      // do somthing 
      myCallbackMethod();// it will implements in future. 
     } 

    } 
} 

когда вы сделаете объект из MyClass, вы должны реализовать myCallbackMethod абстрактный метод. как это

public class NewMain { 

    public static void main(String[] args) { 

     MyClass myClass=new MyClass() { 

      @Override 
      public void myCallbackMethod() { 
       System.err.println("this is call back"); 
      } 
     }; 
     myClass.myMethod(); 
    } 

} 

и результат

это перезвонит

это перезвонит

это перезвонит

это перезвонит

это - обратный звонок

это означает, что вы можете получить пять обратных вызовов из метода void в своем классе. это хороший способ, когда вы не имеете ни малейшего представления для содержания тела myCallBackMethod

реальный пример загрузки файла с сервера в приложении.

можно назвать myCallBackMethod при получении байта и прогрессировать ваш прогрессбар

Смежные вопросы