Spring Web Socket - 从 MQ 监听器通知客户端

Posted

技术标签:

【中文标题】Spring Web Socket - 从 MQ 监听器通知客户端【英文标题】:Spring Web Socket - notify the client from the MQ Listener 【发布时间】:2016-05-05 13:17:16 【问题描述】:

我正在使用 Spring 使用网络套接字。

这是我的控制器。一个简单的控制器,它将接受一个结果对象并返回一个带有填充值的结果对象。它将向 STOMP 主题订阅者“/topic/update”发布消息。

@Controller
public class ReportController 

    @MessageMapping("/charthandler")
    @SendTo("/topic/update")
    public Result pushMessage(Result r) throws Exception 
        Thread.sleep(3000); // simulated delay
        Result result = new Result();
        result.setTitle("ChartsPage");
        return result;
    


我的 Spring 配置文件:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer 

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) 
        registry.addEndpoint("/charthandler").withSockJS();
    

    @Bean
    public WebSocketHandler chartHandler() 
        return new ChartHandler();
    

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) 
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    


我在 javascript 中有以下代码,它创建了一个 STOMP Web Socket 客户端。它正在订阅“/topic/update”

var socket = new SockJS('/reportapplication/charthandler/');
stompClient = Stomp.over(socket);
stompClient.connect(, function(frame) 
  console.log('Connected: ' + frame);
  stompClient.subscribe('/topic/update', function(result) 
    console.log(JSON.parse(result.body).title);
  );
);

现在我计划添加一个侦听器(java 而不是 javascript)来侦听 Rabbit MQ 消息,我想将消息对象传递给我的控制器并将所有消息推送到 Web Socket 客户端。

当消息到达我的 MQ 侦听器时,我不确定如何通知我的所有 web-socket 客户端。 我该怎么做?

创建报表控制器实例并调用pushMessage通知我所有的Web套接字客户端的好方法吗?

ReportController controller = new ReportController();
controller.pushMessage(report);

我也不确定这是否有效。我会试试的。我想知道是否有更好的方法。

有没有更好的方法或更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

如果您查看 Artem Bilan 对以下问题的回复:Spring, how to broadcast message to connected clients using websockets?

因此,如果您的 Rabbit MQ 消息的 java 侦听器在服务中,那么您可以在同一服务中执行以下操作,并调用 sendTo 标记的 WS 通知端点并将预期消息传递给正在侦听的 WS 客户端。

@Autowired
private SimpMessagingTemplate brokerMessagingTemplate;
.......
this.brokerMessagingTemplate.convertAndSend("/topic/greetings", "foo");

【讨论】:

以上是关于Spring Web Socket - 从 MQ 监听器通知客户端的主要内容,如果未能解决你的问题,请参考以下文章

在Active MQ中使用XML spring的JMS SOAP

C#中使用Socket实现简单Web服务器

Spring Boot Web Socket RabbitMQ 不可用

JMS与activemq--4.MQ类型对比/MQ技术选型(资料来源网络)

Spring Boot:使用Rabbit MQ消息队列

Spring boot、javascript 和 web socket 的 CORS 错误