使用SimpMessagingTemplate而不创建Web套接字消息代理Spring

时间:2016-03-04 09:09:57

标签: spring spring-mvc spring-websocket spring-4

我是否可以使用SimpMessagingTemplate#convertAndSendToUserSimpMessagingTemplate#convertAndSend方法向消息代理发送消息,而无需使用@EnableWebSocketMessageBroker设置websocket消息代理?

我尝试做的是利用一个websocket服务器为两个应用服务器实例提供消息(一个春天4和一个春天3)。我创建了一个带有Spring 4,Spring启动和websocket消息代理的Web服务器。

现在我想要两个应用程序服务器将消息推送到rabbitmq,以便将它们广播给订阅它的客户端。

我遇到的第一个问题是,如果没有可用的websockt消息代理配置,SimpMessagingTemplate将无法自动连接到应用程序上下文。我也无法在没有创建websocket留言板的情况下注入它。

请帮我弄清楚这是否可行。

BTW我有一个previous question未答复的相关内容。

1 个答案:

答案 0 :(得分:1)

好吧,在阅读了大量文档后,我自己找到了答案。关键是这个架构正在追随。

enter image description here

在此体系结构中,spring充当消息代理和客户端之间通信的网关。 Spring不执行任何操作(除非必要时),但将请求转发给消息代理(STOMP消息)。 Spring上保留的配置定义了几个重要的事情。一个是交换,另一个是路由密钥。 Spring配置为我们提供了一个抽象层,因此我们可以毫不费力地订阅并将消息推送到消息代理。

SimpMessagingTemplate 是我们用来与消息代理进行通信的抽象层。 Spring使用给定的细节创建bean。好吧,我无法手动创建 SimpMessagingTemplate 的实例。我必须将Spring 3应用程序更新到Spring 4才能使用websockets。

由于Spring和消息代理是分离的,因此群集应用程序实例不会对消息代理产生任何影响。只有当需要订阅频道或需要向频道发布消息时,Spring才会与消息代理进行通信。因此,如果有两个实例订阅相同的通道,那么将使用相同的路由键绑定一个交换的两个队列。发布到通道的消息将可供所有订户(队列)使用,因为它们都使用相同的路由密钥。有关更详细的说明,请参阅rabbitmq stop plugin documentation