Java EE计划任务和强制任务

时间:2013-02-20 08:42:27

标签: multithreading java-ee servlets batch-file

我正在研究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线程,但我想知道有一些最佳实践来执行此操作。

1 个答案:

答案 0 :(得分:0)

有几个选项:创建一个常规线程池(具有多个线程),只要它们进入就把任务放在执行程序队列中。

如果需要更细粒度的控制,可以在servlet和您拥有的一个线程之间共享类似并发队列的内容。让这个线程从队列中读取,当队列为空时它将自动阻塞。

然后你的servlet可以把工作放在这个队列上,如果线程碰巧在获取一个项目时被阻止它会自动唤醒。

您可能想要查看“生产者 - 消费者”模式。有很多关于此的文献。