У меня есть сервлет, который вызывает веб-сервис.
Сервлету НЕ нужно ждать завершения сервлета, поскольку он не требует никакой информации из своего ответа.
Могу ли я создать новый поток для вызова веб-службы?
Будет ли это сделано с новым потоком (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
каким-либо образом в конце обработки.
Но многие не согласны с таким подходом. Давайте послушаем и других.