Начать новую тему в сервлете [дубликаты]

У меня есть сервлет, который вызывает веб-сервис.

Сервлету НЕ нужно ждать завершения сервлета, поскольку он не требует никакой информации из своего ответа.

Могу ли я создать новый поток для вызова веб-службы?

Будет ли это сделано с новым потоком (callWSMethod ()). Start () ?

Если это не рекомендуется, что лучше?

Всего 2 ответа


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

Вы можете просто начать поток:

public class MyThread extends Thread {

public void run(){
   // callWSMethod
}

}

Элегантный способ - использовать Java Lambda.

Runnable callWSMethod =
    () -> { // perform call};

Thread thread = new Thread(callWSMethod);
thread.start();

Пул потоков

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

ExecutorService executorService = Executors.newFixedThreadPool(5);

executorService.execute(new Runnable() {
  public void run() {
    // perform call};
  }
});

Не забудьте выключение

executorService.shutdown();

Поскольку вам не нужны никакие ресурсы JEE, такие как UserTransaction , я чувствую, что это нормально. Тем не менее, пожалуйста, прочитайте до конца.

В более ранних версиях JEE я помню, что это не рекомендовалось, так как при запуске потока не будет управляемых ресурсов и контекстов, таких как EJB, пул соединений, транзакции JTA и т. Д. Однако я не уверен, что это все еще не так. рекомендуется в JEE7. В JEE7 еще есть ManagedExecutorService, который можно использовать для этой цели.

Тем не менее, я делал это много раз без каких-либо проблем с ExecutorService напрямую, до тех пор, пока я не хотел никаких управляемых ресурсов, подобных упомянутым ранее . Я всегда использовал ExecutorService а не Thread напрямую. Единственный «следящий» - это то, что необходимо завершить работу ExecutorService каким-либо образом в конце обработки.

Но многие не согласны с таким подходом. Давайте послушаем и других.


Есть идеи?

10000