如何将两个或多个Spring上下文与RabbitMQ同步?广播信息/活动?
我目前正在评估如何在多个Spring应用程序上下文(即Tomcat集群)之间管理事件同步的一些想法 在该用例中,每个上下文都可以生成一个事件X(不管是Spring上下文事件还是自制事件),该事件X必须广播到所有其他上下文实例。事件只在它的“生命周期”中有效,这意味着我不想以任何方式持续它(因为它们很多,它们的状态在几分钟后就会过时) 我的想法是使用已经存在的RabbitMQ实例。但是,标准的生产者/消费者模式不适合,因为事件应该向所有消费者广播。每个消费者都是生产者。。就像聊天室一样 问题1:RabbitMQ(+Spring集成)是否可以实现这一点?如何建立这样的广播消息设置 问题2:这是否可能?有谁有更好的解决方案/想法吗 用例:每个web应用程序上下文都可以生成类似“用户x邀请用户y”的事件,这些事件应该尽快通过Websocket或EventSource或其他方式传输到用户的浏览器。因为这是(已经)运行的请求,所以可能操作地点(服务器1)不是消费地点(服务器2) 解决方案的主要目标是:如何将两个或多个Spring上下文与RabbitMQ同步?广播信息/活动?,spring,events,rabbitmq,spring-integration,Spring,Events,Rabbitmq,Spring Integration,我目前正在评估如何在多个Spring应用程序上下文(即Tomcat集群)之间管理事件同步的一些想法 在该用例中,每个上下文都可以生成一个事件X(不管是Spring上下文事件还是自制事件),该事件X必须广播到所有其他上下文实例。事件只在它的“生命周期”中有效,这意味着我不想以任何方式持续它(因为它们很多,它们的状态在几分钟后就会过时) 我的想法是使用已经存在的RabbitMQ实例。但是,标准的生产者/消费者模式不适合,因为事件应该向所有消费者广播。每个消费者都是生产者。。就像聊天室一样 问题1:R
<beans profile="rabbit">
<rabbit:connection-factory id="connectionFactory" channel-cache-size="10" host="${rabbitmq.host}"
port="${rabbitmq.port}" username="${rabbitmq.username}"
password="${rabbitmq.password}" virtual-host="${rabbitmq.virtualhost}"/>
<rabbit:admin connection-factory="connectionFactory"/>
<rabbit:queue id="eventQueue" name="${rabbitmq.queue.springevents}" auto-delete="false" durable="true"></rabbit:queue>
<bean id="amqpTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="exchange" value="${rabbitmq.springevents.exchange.fanout}"/>
<property name="replyTimeout" value="${rabbitmq.replyTimeout}"/>
</bean>
<!-- Receiving -->
<int-amqp:inbound-channel-adapter connection-factory="connectionFactory" channel="mqEventInChannelJson"
queue-names="${rabbitmq.queue.springevents}"/>
<!-- Sending -->
<int-amqp:outbound-channel-adapter channel="mqEventOutChannelJson" amqp-template="amqpTemplate" routing-key=""
exchange-name="${rabbitmq.springevents.exchange.fanout}" />
</beans>
}
有鉴于此,我可以动态创建一个在公共exchange上注册的唯一队列。不需要外部配置步骤
<util:property-path id="applicationId" path="application.id" />
<rabbit:queue id="eventQueue" name="${rabbitmq.queue.springevents}_#{applicationId}" auto-delete="true" durable="true" exclusive="true">
<rabbit:queue-arguments>
<!-- Attention if you want to declare mixed value types: https://jira.springsource.org/browse/AMQP-198 -->
<entry key="x-message-ttl">
<value type="java.lang.Long">${rabbitmq.queue.ttl}</value>
</entry>
</rabbit:queue-arguments>
</rabbit:queue>
${rabbitmq.queue.ttl}
您可以使用或,并让每个使用者将队列绑定到它。完全由Spring AMQP和Spring Integration支持。如果您使用Comed、Atmosphere或一些高级AJAX(可能是Spring的DeferedResult或其他),您可以“订阅”客户机(浏览器)一个主题,让客户机确定他们是否关心某个特定消息。我知道Atmosphere有一个JMS插件。是的,这就是我想要的。只是忘了交换东西。。我稍微更新了一下我的问题。
<util:property-path id="applicationId" path="application.id" />
<rabbit:queue id="eventQueue" name="${rabbitmq.queue.springevents}_#{applicationId}" auto-delete="true" durable="true" exclusive="true">
<rabbit:queue-arguments>
<!-- Attention if you want to declare mixed value types: https://jira.springsource.org/browse/AMQP-198 -->
<entry key="x-message-ttl">
<value type="java.lang.Long">${rabbitmq.queue.ttl}</value>
</entry>
</rabbit:queue-arguments>
</rabbit:queue>