我正在研究Java EE Web应用程序。 我使用@WebListener注释开发了一个预定批处理:
@WebListener
public class BatchServlet implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
context = sce.getServletContext();
schedulerEngine = Executors.newSingleThreadScheduledExecutor();
schedulerEngine.scheduleAtFixedRate(new MyThread(), 0, 300, TimeUnit.SECONDS);
}
public class MyThread implements Runnable {
@Override
public void run() {
...... //my business logic
}
并且它可以正常工作。
但是,出于我的目的,我需要按需强制MyThread()批处理,例如,当我在Servlet中收到特定请求时。显然,我可以单独调用MyBatch线程,但我想知道有一些最佳实践来执行此操作。
答案 0 :(得分:0)
有几个选项:创建一个常规线程池(具有多个线程),只要它们进入就把任务放在执行程序队列中。
如果需要更细粒度的控制,可以在servlet和您拥有的一个线程之间共享类似并发队列的内容。让这个线程从队列中读取,当队列为空时它将自动阻塞。
然后你的servlet可以把工作放在这个队列上,如果线程碰巧在获取一个项目时被阻止它会自动唤醒。
您可能想要查看“生产者 - 消费者”模式。有很多关于此的文献。