Spring Web Socket - 从 MQ Listener 通知客户端

Spring Web Socket - notify the client from the MQ Listener

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

这是我的控制器。一个简单的控制器,它将接受一个结果对象和 return 一个具有填充值的结果对象。它会向 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");
    }

}

我在 java 脚本中有以下代码,它创建了一个 STOMP Web 套接字客户端。它正在订阅“/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 而不是在 java 脚本中),它将侦听 Rabbit MQ 消息,我想将消息对象传递到我的控制器并推送所有消息到 Web 套接字客户端。

当消息到达我的 MQ 侦听器时,我不确定如何通知我所有的网络套接字客户端。 我该怎么做?

创建报表控制器的实例并调用 pushMessage 通知我所有的 web 套接字客户端是不是一个好方法。

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

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

是否有更好的方法或更好的方法?

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

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

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