在我的JavaEE Web应用程序中,我需要按照到达顺序严格处理传入的消息。我假设我的Web应用程序容器(Tomcat 6)保留了消息到达HTTP端口的顺序。
让我头疼的是,我内部处理这些消息的方式。为了改善工作量,我将每个消息的处理附加到线程池中,因为需要执行许多操作,例如XML解析,有时使用外部Web服务来增强数据。处理完成后,我将消息的Java表示推送到一个复杂的流处理引擎esper.codehaus.org中,该引擎是线程安全的。在这里,检查不同的模式,其中入口顺序是最高要求,例如现象的阈值超过。
我曾想过将每个已处理的消息插入到PriorityQueue中,并使用它们在Servlet中接收到的优先级ID(对于每个消息递增)进行排序。问题在于:
轮询队列元素(最低ID是队列头部)以将其插入esper的线程可能会跳过一个ID,因为它不会检查缺失的项目。我猜一个例子能更好地说明:
我尝试的是修改轮询队列头部的实现方式,以遵循ID的严格顺序。也就是说,如果下一个ID的元素还没有插入到队列中,则在屏障处等待直到其到达。这似乎在前10分钟内有效,但后来挂起,可能是由于某个元素从未插入到队列中。
是否有人曾经遇到过类似的问题,并对我有一些提示?
让我头疼的是,我内部处理这些消息的方式。为了改善工作量,我将每个消息的处理附加到线程池中,因为需要执行许多操作,例如XML解析,有时使用外部Web服务来增强数据。处理完成后,我将消息的Java表示推送到一个复杂的流处理引擎esper.codehaus.org中,该引擎是线程安全的。在这里,检查不同的模式,其中入口顺序是最高要求,例如现象的阈值超过。
我曾想过将每个已处理的消息插入到PriorityQueue中,并使用它们在Servlet中接收到的优先级ID(对于每个消息递增)进行排序。问题在于:
轮询队列元素(最低ID是队列头部)以将其插入esper的线程可能会跳过一个ID,因为它不会检查缺失的项目。我猜一个例子能更好地说明:
我尝试的是修改轮询队列头部的实现方式,以遵循ID的严格顺序。也就是说,如果下一个ID的元素还没有插入到队列中,则在屏障处等待直到其到达。这似乎在前10分钟内有效,但后来挂起,可能是由于某个元素从未插入到队列中。
是否有人曾经遇到过类似的问题,并对我有一些提示?