如何独立处理Servlet中的数据



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

A) Javaservlet接收POST请求,从POST请求中获取Parameters并将其存储在公共静态LinkedList:中

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

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

incomingQueue.push(myObject);

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

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

显然,我没有一个主课来做这件事。如何创建这样一个类,在servlet不触发的情况下访问incomingQueue?正确的体系结构是什么?

谢谢你抽出时间。

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

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

如果您使用的是spring,那么您可以在ejb中使用@Scheduled注释:TimerService@Schedule

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

您有几个选项:

  1. 使用Quartz等调度库
  2. 如果您不想使用单独的库,您应该向web.xml添加一个Listener,它扩展ServletContextListener并在contextInitialized()上启动一个单独的线程

另外:请注意@BrianRoach的评论。关于同步列表的要点相当重要。

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

一个非常核心的解决方案是像生产者和消费者一样实现它。下面是一个使用堆栈和1个生产者和3个消费者的示例。

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

最新更新