2015-10-19 1 views
0

У меня есть сервлет, который имеет ExecutorService, который делает HTTP-запросы нескольким адресатам. Я не уверен, как я завершаю ExecutorService. У меня нет метода destroy() в Resteasy?Как отключить ExecutorService в Resteasy

@Path("ops") 
public class Dashboard{ 

ExecutorService threadExecutor = Executors.newCachedThreadPool(); 

@GET 
@Path("data") 
@Produces("application/json") 
public Response getDataFromDCs(){ 
    try{ 
    threadExecutor.invokeAll(jobWorkers, 6000, TimeUnit.SECONDS); 
    }catch(Exception e){} 
    finally{ 
    //should call threadExecutor.shutdown() here? 
    } 
} 
} 
+0

Вы уверены, что отключение() нет? Вы используете https://docs.jboss.org/resteasy/docs/2.2.1.GA/javadocs/org/jboss/resteasy/plugins/server/servlet/HttpServletDispatcher.html? У этого класса есть destroy(), и вы можете вызвать threadExecutor.shutdown() –

+0

Я использую стиль Resteasy Singleton для обертки моих конечных точек. HttpServletDispatcher определяется в web.xml: <имя сервлета> Resteasy <сервлет имя-/> <сервлет-класс> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher javax.ws.rs.Application com.company.WSApplication MoneerOmar

ответ

0

Вы можете создать Singleton класс, который будет иметь логический исполнитель Service инициирована, уничтожить метод и обслуживание (jobWorker, внутр время, TimeUnit TimeUnit). Затем напишите Listener, реализующий HTTPServletListener, и в контекстеDestroyed вызовите метод destroy для одноэлементного класса. Это избавит вас от повторного запуска исполнителя при каждом вызове службы, и вы можете безопасно завершить работу исполнителя при завершении работы приложения. и в классе webservice в getDataFromDCs() получить экземпляр класса singleton и вызвать метод service, передающий аргументы.

+0

ли я действительно выключать ExecutorService, когда я выключить сервер? Может ли ExecutorService жить после завершения процесса сервера? – MoneerOmar

+0

Да, вам нужно правильно выключить его, попробуйте с простой программой и не добавьте .shutdown в последний раз, вы увидите, что потоки в debug будут по-прежнему жить. –

0

вы можете вызвать метод выключения потока Executor. Но это не гарантирует завершения всей задачи. Вы должны также использовать awaitTermination, например:

while(!executor.awaitTermination(100, TimeUnit.SECONDS)) { 
    LOGGER.info("Awaiting completion of threads."); 
} 

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination(long,%20java.util.concurrent.TimeUnit)