асинхронная работа

0
29 авг 2016 18:49
Добрный день!
На TomCat есть сервис, работающий в синхронном/асинхронном режиме.
Сервис в общих чертах выполняет сл. действия:
1. создает объект запроса в БД. (из БД возвращается Id созданного объекта)
2. Для полученного Id - вызывается другой сервис, выполняются нужные действия, возращается результат.
3. Вовращается Id объета запроса (созданного в 1п.)
В асинхронном режиме, сервис должен сразу возвращать Id объекта, не дожидаясь результата выполнения 2.п.
Сделал сл. образом:

@WebService(serviceName = "TestWS")
public class TestWS 
{
    private class TAsync implements Runnable{
         String  queryID;
         TAsync(String _queryID) {
             this.queryID = _queryID;
         }

         public void run() {
             // вызывается др. сервис
             // ...
         }
     }

    @WebMethod(operationName = "TestM")
    public String TestM(@WebParam(name = "Data") String Data, @WebParam(name = "Mode") Integer Mode)
    {
        // 1п. вызывается сервис (создается объект запроса)
        // ...
        String QueryID = "1"; // рез-т 1п.
        
        // 2п. 
        if ( Mode == 1 ) // синхронно
        { }
        else // асинхронно
        {
            Runnable r = new TAsync(Data);
            new Thread(r).start();
        }
        
        // в асинхронном режиме возвращаем QueryID, не дожидаясь результата 2п.
        return QueryID;
    }
}


Подскажите пожалуйста, правильно ли сделал?

Ответов: 2

1
30 авг 2016 16:14
Чтобы не порождать каждый раз новый тред(1Mb только требуется на стек) используйте ExecutorService. Правда его в свою очередь нужно оставновить когда останавливается приложение, чтобы а) дождаться выполнения всех ассинхронных задач прежде чем остановить приложение, б) в случае если tomcat не перезапускает после каждого деплоя приложения остановка экзекьютора позволит избежать утечки класслоадеров. Но зато можно положить экзекьютор в сервелет контекст и переиспользовать в других местах если где-то понадобится. Пример можете посмотреть здесь.
0
31 авг 2016 06:35
Приветствую!

Насколько я помню, в той же стандартной реализации JAX-WS это уже реализовано на уровне фреймворка.
Модераторы: Нет
Сейчас эту тему просматривают: Нет