Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将两个或多个Spring上下文与RabbitMQ同步?广播信息/活动?_Spring_Events_Rabbitmq_Spring Integration - Fatal编程技术网

如何将两个或多个Spring上下文与RabbitMQ同步?广播信息/活动?

如何将两个或多个Spring上下文与RabbitMQ同步?广播信息/活动?,spring,events,rabbitmq,spring-integration,Spring,Events,Rabbitmq,Spring Integration,我目前正在评估如何在多个Spring应用程序上下文(即Tomcat集群)之间管理事件同步的一些想法 在该用例中,每个上下文都可以生成一个事件X(不管是Spring上下文事件还是自制事件),该事件X必须广播到所有其他上下文实例。事件只在它的“生命周期”中有效,这意味着我不想以任何方式持续它(因为它们很多,它们的状态在几分钟后就会过时) 我的想法是使用已经存在的RabbitMQ实例。但是,标准的生产者/消费者模式不适合,因为事件应该向所有消费者广播。每个消费者都是生产者。。就像聊天室一样 问题1:R

我目前正在评估如何在多个Spring应用程序上下文(即Tomcat集群)之间管理事件同步的一些想法

在该用例中,每个上下文都可以生成一个事件X(不管是Spring上下文事件还是自制事件),该事件X必须广播到所有其他上下文实例。事件只在它的“生命周期”中有效,这意味着我不想以任何方式持续它(因为它们很多,它们的状态在几分钟后就会过时)

我的想法是使用已经存在的RabbitMQ实例。但是,标准的生产者/消费者模式不适合,因为事件应该向所有消费者广播。每个消费者都是生产者。。就像聊天室一样

问题1:RabbitMQ(+Spring集成)是否可以实现这一点?如何建立这样的广播消息设置

问题2:这是否可能?有谁有更好的解决方案/想法吗

用例:每个web应用程序上下文都可以生成类似“用户x邀请用户y”的事件,这些事件应该尽快通过Websocket或EventSource或其他方式传输到用户的浏览器。因为这是(已经)运行的请求,所以可能操作地点(服务器1)不是消费地点(服务器2)

解决方案的主要目标是:

  • (相对)快速且可扩展
  • 火&忘记。如果消息已发送,请销毁它。如果信息是无关的,那就忘了它。没有坚持。在RabbitMQ中,这可以通过TTL实现
  • 消息正在针对一个模型进行序列化,即使用Jackson或类似的东西
  • 没有基于(活动)上下文/节点数量的手动配置。如果我想添加一个额外的上下文(web服务器、后端进程等等),我不想修改同步设置
  • 更新1 在读了《安瑟》之后,我把它玩了一点

        <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>