我试图编写一个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]
但是消息永远不会被打印出来。我已经尝试了几天了,所以我们将不胜感激。
答案 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"));
...
}
最好将传入和传出的代码包装在定义的类中。这样,可以更轻松地对其进行序列化和反序列化。
来源: