如何独立处理来自Servlet的数据?

时间:2012-03-03 14:09:46

标签: java servlets queue

我开发了以下程序/架构:

A)Java servlet接收POST请求,从POST请求中获取参数并将它们存储在公共静态LinkedList中:

public static LinkedList incomingQueue = new LinkedList<myObjects>();

也就是说,对于每个POST请求,我都这样做:

incomingQueue.push(myObject);

现在,我想定期访问队列并对对象执行处理:

while(true){
doProcessing(incomingQueue);
wait(someTime);
}

显然,我没有主要课程来做这件事。如何创建这样一个可以访问incomingQueue 而没有由servlet触发的类?这样做的正确架构是什么?

感谢您的时间。

3 个答案:

答案 0 :(得分:0)

您有几种选择:

  1. 使用Quartz
  2. 等计划库
  3. 如果您不想使用单独的库,则应向web.xml扩展ServletContextListener添加一个监听器,并在contextInitialized()上启动一个单独的帖子。
  4. 另外:注意@BrianRoach的评论。关于同步列表的观点非常重要。

答案 1 :(得分:0)

首先,队列应放在servlet上下文属性中(请参阅:ServletContext.setAttribute()。此外,必须同步对此队列的访问,请考虑ArrayBlockingQueue

在普通的servlet中,您可以通过contextInitialized()中的线程启动contextDestroyed并在TimerService中断它来使用ServletContextListener

如果您使用的是,则可以@Scheduled annotation:{{1}}或使用@Schedule

最后,标准Java中有一个Timer类。最后但同样重要的是,看看,在您的情况下,这可能是更好的选择。

答案 2 :(得分:0)

您需要同步方法以进行并发访问。

非常难的核心解决方案是像生产者和消费者一样实施它。 Here是一个使用stack和1个生产者以及3个消费者的例子。

更简洁的解决方案是使用JMS