在将消息发送到ActiveMQ之前汇集消息

时间:2015-01-16 08:54:43

标签: java jms activemq

要求是通过JMS(最有可能是ActiveMQ)从Tomcat发送网站访问者生成的表单数据。有两个相互竞争的想法 - 一个将利用中间存储和一个线程池发送到队列(如果由于某种原因发布到JMS失败,则尝试重新发送),另一个是尝试直接通过JMS从JMS发送有效负载处理访问者的线程'发布请求 - 如果由于某种原因JMS发布失败,则请求失败。

第二种选择对我来说似乎更好,因为我认为在消息队列前添加中间存储是一种过度的做法 - 消息队列本身应该是中间存储。听起来不错吗?

1 个答案:

答案 0 :(得分:0)

什么?等待 - MQ Broker是一个中间(持久)存储,用于处理接收方的可以处理重新发送的停机时间。尽管如此,你还是有点对。您不希望因为您的(远程)代理已关闭而错过该订单。解决该问题的弹性解决方案是设置本地(可能是嵌入式)ActiveMQ代理,然后建立与远程代理的“代理网络”连接。您可以确定本地代理与您的Web应用程序一起运行,并且它将处理远程代理的重新传输,如果它暂时处于脱机状态。

但是,我会建议不要实现一个简单的内存缓冲区来保存数据,直到它可以发布到代理。

让我们看一个场景(我只是在构成表单的目的):

  1. 用户A通过表单订购自行车并按提交。
  2. 将自行车订单放在要发送的内存“池”中。
  3. 向用户返回一条消息,说“谢谢您的订单,自行车将很快到达”。
  4. 无论出于何种原因,MQ代理都已关闭。
  5. 一段时间过去了
  6. Web服务器重新启动,因为某些管理员发现了一个需要安装的补丁。
  7. 由于“重新启动池”中的内存在重新启动期间被清除,因此订单消失。
  8. 一周后,客户抱怨丢失的自行车,而销售部门也不知道他在说什么。