0

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

4

1 回答 1

0

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

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

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

您可能想查找“生产者-消费者”模式。有很多关于这方面的文献。

于 2013-02-21T10:14:06.263 回答