使用Spring集群JMS

时间:2014-02-28 20:10:16

标签: jboss jms activemq jboss5.x spring-jms

作为开发人员,我需要将JMS集群化,以便只有一个节点处理任务(任务平均队列消息),并且当一个节点发生故障时,另一个节点可以处理任务。

假设:

  • 在群集节点上复制JMS队列
  • 任务仅处理一次(在一个节点上,没有分布式队列)
  • 即使某些节点被删除,也会持续处理
  • 任务
  • 应用程序可以在单个节点上运行,无需更改代码或重新编译

目前的应用技术堆栈:

基于Spring 3.2.X和嵌入式ActiveMQ代理的Web应用程序,它在应用程序初始化期间(< amq:broker />)没有持久性。只有此应用程序使用创建的代理应用程序在JBoss 5.0.1上运行。

现在我必须决定我们将使用哪种方法进行上述故障转移群集。我正在考虑切换到JBoss消息传递(由该版本的JBoss提供),但我注意到这个实现已经过时并且存在很多错误。

目前,我在以下几种可能性之间犹豫不决:

  • 在作为集群连接的两个JBoss节点(http://activemq.apache.org/integrating-apache-activemq-with-jboss.html)上嵌入ActiveMQ
  • 只在没有集成的情况下将ActiveMQ部署到JBoss(我注意到ActiveMQ 5.9在activemq-jms-ds.xml的上面链接中没有提到集成而启动,我可以直接连接到JMS,没有连接工厂和Spring定义的JNDI)。我是对的吗?
  • 两个嵌入式代理在两个节点上以Spring应用程序开始并作为集群连接(?)是否可能?
  • 分别启动了两个作为集群连接的ActiveMQ服务器(较新版本的ActiveMQ不需要容器,可以单独运行)

以上哪项可能是最好的?我应该采取另一种方式吗?

JMS群集对我来说相对较新,所以欢迎所有评论/评论。

1 个答案:

答案 0 :(得分:1)

我决定使用在两台服务器上配置的外部ActiveMQ作为故障转移群集(并且客户端通过ActiveMQ提供的故障转移协议进行连接)。 ActiveMQ部署到JBoss服务器。

我还尝试在Spring中运行嵌入式ActiveMQ配置为故障转移群集,但我遇到了一个常见问题:使用故障转移配置,一个ActiveMQ代理正在等待文件/ db上的锁定,这种情况会暂停Spring上下文的初始化 - 即我不能使用这种方法的原因(第二个节点的应用程序应该工作)。