使用Java Spring Boot Framework订阅STOMP消息

时间:2019-09-04 23:22:17

标签: java spring activemq stomp

我试图编写一个Spring服务,该服务订阅一个外部只读STOMP代理并读取/处理它发布的消息。

铁路公司将消息推送到主题“ / topic / TRAIN_MVT_ALL_TOC”。我可以成功连接到该主题,但似乎无法实例化其消息的侦听器。

我已经设置了一个Spring @Configuration类来连接到该类,并且在运行该应用程序后,它似乎可以正确连接。

我还使用@MessageMapping批注创建了消息处理例程,以侦听我感兴趣的特定主题(“ TRAIN_MVT_ALL_TOC”)。问题在于它似乎从未被调用过。

配置类代码:`

@Configuration
@EnableWebSocketMessageBroker
public class StompConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/TRAIN_MVT_ALL_TOC").withSockJS();
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableStompBrokerRelay("/topic")
                .setRelayHost("datafeeds.networkrail.co.uk")
                .setRelayPort(61618)
                .setSystemLogin("MYEMAIL")
                .setSystemPasscode("MYPASSWORD")
        ;
    }
}

消息处理程序代码:

@MessageMapping("/TRAIN_MVT_ALL_TOC")
public void onMessage(@Payload String message) throws Exception {
    System.out.println(message);
}

以下日志条目将输出到控制台,表明连接成功。

  

oswscWebSocketMessageBrokerStats:WebSocketSession [0当前WS(0)-HttpStream(0)-HttpPoll(0),总计0,异常关闭0(0连接失败,0发送限制,0传输错误)],stompSubProtocol [已处理CONNECT (0)-CONNECTED(0)-DISCONNECT(0)],stompBrokerRelay [1个会话,ReactorNettyTcpClient [TcpClient:连接到datafeeds.networkrail.co.uk:61618](可用),已处理的CONNECT(1)-CONNECTED(1) -DISCONNECT(0)],inboundChannel [池大小= 0,活动线程= 0,排队的任务= 0,已完成的任务= 0],outboundChannelpool大小= 0,活动的线程= 0,已排队的任务= 0,已完成的任务= 0] ,sockJsScheduler [池大小= 1,活动线程= 1,排队的任务= 0,已完成的任务= 0]

但是消息永远不会被打印出来。我已经尝试了几天了,所以我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

铁路公司将消息推送到主题“ / topic / TRAIN_MVT_ALL_TOC”。我可以成功连接到该主题,但似乎无法实例化其消息的侦听器。

您是说客户端上的侦听器,例如sockjs客户端?

@MessageMapping("/TRAIN_MVT_ALL_TOC")
public void onMessage(@Payload String message) throws Exception {
    System.out.println(message);
}

您什么也不返回,需要将其发送到这样的主题:

@MessageMapping("/TRAIN_MVT_ALL_TOC")
@SendTo("/topic/TRAIN_MVT_ALL_TOC")
public Greeting onMessage(HelloMessage message) throws Exception {
    return new Greeting("hello");
}

或者如果您的构造函数的参数中包含SimpMessageSendingOperations(应由Spring Boot本身自动连接),则可以将多个消息发送到同一主题,如下所示:

@Autowired
public Constructor(SimpMessageSendingOperations messagingTemplate) {
    this.messagingTemplate = messagingTemplate;
}

@MessageMapping(WebSockets.READER_MAPPING)
public void streamOverWebsocket(HelloMessage message) throws Throwable {
    String topicUrl = "/topic/TRAIN_MVT_ALL_TOC";
    messagingTemplate.convertAndSend(topicUrl, new Message("response 1"));
    messagingTemplate.convertAndSend(topicUrl, new Message("response 2"));
    ...
}

最好将传入和传出的代码包装在定义的类中。这样,可以更轻松地对其进行序列化和反序列化。

来源: