【问题标题】:Declare and use RabbitMQ with Spring 4 Websockets使用 Spring 4 Websockets 声明和使用 RabbitMQ
【发布时间】:2014-02-14 14:34:22
【问题描述】:

在我们当前的应用程序中,我们以这种方式使用 Spring AMQP:

<rabbit:connection-factory  id="cachingConnectionFactory" 
                            username="${rabbitmq.connection.username}"
                            password="${rabbitmq.connection.password}"
                            host="${rabbitmq.connection.host}" 
                            port="${rabbitmq.connection.port}"
                            executor="rabbitmqPoolTaskExecutor"
                            requested-heartbeat="${rabbitmq.connection.requested-heartbeat}"
                            channel-cache-size="${rabbitmq.connection.channel-cache-size}"
                            virtual-host="${rabbitmq.connection.virtual-host}" />

<rabbit:admin   id="adminRabbit" 
                connection-factory="cachingConnectionFactory"
                auto-startup="true" />

<rabbit:template    id="rabbitTemplate"
                    connection-factory="cachingConnectionFactory"
                    exchange="v1.general.exchange"
                    message-converter="jsonMessageConverter" 
                    encoding="${rabbitmq.template.encoding}"
                    channel-transacted="${rabbitmq.template.channel-transacted}" />

<rabbit:queue id="v1.queue.1" name="v1.queue.1"  />
<rabbit:queue id="v1.queue.2" name="v1.queue.2" />
<rabbit:queue id="v1.queue.3" name="v1.queue.3" />

<fanout-exchange name="v1.general.exchange" xmlns="http://www.springframework.org/schema/rabbit" >
    <bindings>
        <binding queue="v1.queue.1" />
        <binding queue="v1.queue.2" />
        <binding queue="v1.queue.3" />
    </bindings>
</fanout-exchange>

<listener-container xmlns="http://www.springframework.org/schema/rabbit"
                    connection-factory="cachingConnectionFactory" 
                    message-converter="jsonMessageConverter" 
                    task-executor="rabbitmqPoolTaskExecutor"
                    auto-startup="${rabbitmq.listener-container.auto-startup}"
                    concurrency="${rabbitmq.listener-container.concurrency}"
                    channel-transacted="${rabbitmq.listener-container.channel-transacted}"
                    prefetch="${rabbitmq.listener-container.prefetch}"
                    transaction-size="${rabbitmq.listener-container.transaction-size}" >

    <listener id="v1.listener.queue.1" ref="listener1" method="handleMessage" queues="v1.queue.1" />
    <listener id="v1.listener.queue.2" ref="listener2" method="handleMessage" queues="v1.queue.2" />
    <listener id="v1.listener.queue.3" ref="listener3" method="handleMessage" queues="v1.queue.3" />

</listener-container>

<bean id="amqpServerConnection" class="com.sub1.sub2.RabbitGatewayConnectionImpl">
    <property name="rabbitTemplate" ref="rabbitTemplate" />
</bean>

当我在基于 Spring 4 的新应用程序中配置 websocket 时,我不知道如何/在哪里声明交换、队列等...

registry.enableStompBrokerRelay("/example1/", "/example2/")
            .setApplicationLogin("guest")
            .setApplicationPasscode("guest")
            .setAutoStartup(true)
            .setRelayHost("localhost")
            .setRelayPort(5672)
            .setSystemHeartbeatReceiveInterval(10000)
            .setSystemHeartbeatSendInterval(10000);

这东西必须用AMPQ实现了吗?

【问题讨论】:

    标签: spring-4 spring-messaging spring-websocket


    【解决方案1】:

    本质上,客户端建立 WebSocket 会话并使用 STOMP 进行消息传递(STOMP over WebSocket),而不是 AMQP。在 STOMP 中,一切都由目标标头驱动,由消息代理来定义它的含义。例如,查看RabbitMQ STOMP plugin 页面,了解 Rabbit 如何将 STOMP 目的地映射到队列和交换。

    因此,如果您将 RabbitMQ 视为您已经管理队列、交换等的消息代理。在 Web 应用程序端,消息传递协议是 STOMP,客户端可以将消息发送到映射到 @MessageMapping 控制器方法或到 RabbitMQ 支持的目的地。此外,控制器或注入SimpMessagingTemplate 的任何其他组件可以将消息发送到代理(Rabbit),然后将广播到连接的网络客户端。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      相关资源
      最近更新 更多