加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 并发处理消息的严格顺序

发布时间:2020-12-14 16:26:17 所属栏目:Java 来源:网络整理
导读:在我的 JavaEE Web应用程序中,我需要按照到达顺序严格处理传入的邮件.我假设我的webapp容器(Tomcat 6)在邮件到达http端口时保留消息的顺序. 引起头痛的是我在内部处理这些信息的方式.为了改进工作负载,我将每个消息的处理附加到ThreadPool,因为需要在这里完
在我的 JavaEE Web应用程序中,我需要按照到达顺序严格处理传入的邮件.我假设我的webapp容器(Tomcat 6)在邮件到达http端口时保留消息的顺序.

引起头痛的是我在内部处理这些信息的方式.为了改进工作负载,我将每个消息的处理附加到ThreadPool,因为需要在这里完成许多事情. XML解析,有时使用外部Web服务丰富数据.处理完成后,我将消息的java表示推送到一个复杂的流处理引擎esper.codehaus.org,这是线程安全的.这里,检查不同的模式,其中入口顺序是最高要求,例如现象的阈值超过.

我想到将每个处理后的消息插入到PriorityQueue中,并在到达时收到一个优先级ID(在我的Servlet中,每个消息递增).问题是如下:

从队列中轮询元素的线程(最低ID是队列的头部)将其插入到esper中可能会跳过一个ID,因为它不检查缺少的项目.我想一个插图比较好:

对于步骤(1)至(4),一切都按预期工作.但是在步骤(5),QueuePoller检索元素6而不是元素4(稍后在步骤(6)插入).这导致消息顺序:2; 3; 6; 4.

我试图做的是改变轮询队列的头部遵循严格的ID顺序的实现.意思是,如果下一个ID的元素尚未插入到队列中,请等待屏障直到其中.这似乎在前10分钟工作,但后来挂起,可能是因为一个元素没有插入队列.

任何人在过去有类似的问题,对我有一些提示?

解决方法

查看 Disruptor – 严格订单的高性能队列(首先进入首选)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读