2013-08-29 3 views
2

Несмотря на множество исследований в Интернете, я не могу найти решение моей проблемы. Я бы хотел позвонить службе из графического интерфейса. Услуга (метод Rest) запускает асинхронную обработку с помощью потока. Я хочу, чтобы служба немедленно дала ответ на графический интерфейс, чтобы графический интерфейс не был заблокирован. В конце потока служба должна дать второй ответ, указав GUI, что обработка завершена.Невозможно получить асинхронный ответ с reasteasy

Что я хочу сделать, похоже, соответствует асинхронной HTTP-части Reasteasy. Итак, я попробовал этот код (я позволяю только важные детали для моей проблемы):

@PUT 
@Path("/duplicate/1") 
public void duplicate( UcModel uc, 
           final @Suspend(TIMEOUT_ASYNCHRONOUS_DUPLICATION) AsynchronousResponse response) throws BusinessException { 


     Thread t = new Thread() { 
      @Override 
      public void run() { 

       try { 
        Thread.sleep(40000); 
       } catch (InterruptedException e) { 
       } 

       Response jaxrs = Response.ok(result).build(); 
       response.setResponse(jaxrs); 
      } 
     }; 
     t.start(); 
    } 
} 

В моем web.xml, я поместил этот код:

<servlet> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <servlet-class> 
     org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher 
    </servlet-class> 
    <async-supported>true</async-supported> 
</servlet> 

Проблемы : веб-служба не дает ответ немедленно. Он дает ответ только в конце потока, и графический интерфейс блокируется. Просмотрев код, я даже не понимаю, как служба может сразу дать ответ с результатом «void».

Для информации: вызов веб-службы выполнен в ExtJS, структуре JavaScript. Он выполняет запрос Ajax.

Было бы здорово, если бы кто-то помог мне с этой проблемой. Заранее спасибо

Седрик

ответ

6

Вы должны использовать два различных веб-сервисы, чтобы решить эту проблему.

AsynchronousResponse в основном предназначен для поддержки производительности пула серверов, а не для клиентской стороны.

Сервер имеет ограниченное количество потоков в пуле потоков, которое может обслуживать запрос клиента, и с помощью AsynchronousResponse вы можете поместить трудоемкие задания в фоновый поток.

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

Другой вариант состоит в том, чтобы опробовать класс java ChunkedOutput, который можно найти here.

Это для отправки сообщений в «типизированных» кусках. Полезен для длительных процессов, которые требуют частичных ответов.

Пример:

@Path("/test") 
public class TestResource { 
    @GET 
    public ChunkedOutput getTestResponse() { 
     final ChunkedOutput chunkedOutputs = new ChunkedOutput(String.class); 
     new Thread() { 
      public void run() { 
       try {     
        while (hasNextValue()) {       
         chunkedOutputs.write(getNextLongRunningOperationValue()); 
        }      
       } catch (IOException e) { 
        (...) 
       } finally { 
        chunkedOutputs.close();       
       } 
      } 
     }.start(); 
     //the chunkedOutputs will be probably returned even before a first value is written by the new thread 
     return chunkedOutputs; 
    } 

    private boolean hasNextValue() { 
     (...) 
    } 

    private String getNextLongRunningOperationValue() { 
     (...) //this takes a lot of time, so it's time for a coffee :)   
    } 
}
+0

Спасибо за ваш ответ. К сожалению, у меня не будет достаточно времени, чтобы попробовать это решение, потому что сегодня я покидаю свой проект. Итак, моим обходным решением будет полностью удалить асинхронную часть моего метода и обеспечить, чтобы клиент не блокировался запросом на обработку. Я даю свой ответ моим коллегам, может быть, у кого-то будет один день, чтобы посмотреть на него и попробовать решение кометы – user2622053

+0

хорошо, удачи и, пожалуйста, не забудьте проголосовать, если ответ был полезен для вас –

+0

Я пробовал голосовать, но я новичок на этом форуме, поэтому у меня недостаточно репутации для голосования – user2622053

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