【问题标题】:Using the Java Spring Boot Framework to subscribe to STOMP messages使用 Java Spring Boot Framework 订阅 STOMP 消息
【发布时间】:2020-01-07 20:02:39
【问题描述】:

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

消息由铁路公司推送到主题“/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[pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]

但是,消息永远不会被打印出来。几天来,我一直在努力查明这一点,因此我们将不胜感激。

【问题讨论】:

    标签: java spring activemq stomp


    【解决方案1】:

    消息由铁路公司推送到主题“/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"));
        ...
    }
    

    最好将传入和传出包装在定义的类中。这样就更容易对其进行序列化和反序列化。

    来源:

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多