2013-02-20 30 views
0

我正在研究Java EE Web应用程序。 我使用@WebListener注释开发的计划的批处理:Java EE计划任务和强制任务

@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

有几个选项:创建一个普通的线程池(多线程),并在每次他们来执行程序中的队列只是把任务

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

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

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