当前位置: 首页 > 知识库问答 >
问题:

使用JavaSpring Boot Framework订阅STOMP消息

佴淮晨
2023-03-14

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

铁路公司将消息推送到主题“/topic/TRAIN\u MVT\u ALL\u TOC”。我可以成功地连接到主题,但似乎无法将侦听器实例化为其消息。

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

我还创建了消息处理例程,使用@Message映射注释来收听我感兴趣的特定主题(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);
}

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

o. s. w. s. c.WebSocketMessageBrokerStats: WebSocketsession[0当前WS(0)-HttpStream(0)-HttpPoll(0),0总计,0异常关闭(0连接失败,0发送限制,0传输错误)],StumpSubProtocol[已处理CONNECT(0)-CONNECTED(0)-DISCONNECT(0)],StumpBrokerRelay[1会话,ReactorNettyTcpClient[TcpClient:连接到datafeeds.networkrail.co.uk:61618](可用),已处理的CONNECT(1)-CONNECTED(1)-DISCONNECT(0)],在边界通道[池大小=0,活动线程=0,排队任务=0,已完成任务=0],在边界通道大小=0,活动线程=0,排队任务=0,已完成[池大小=1,活动线程=1,排队任务=0,已完成任务=0]

然而,这条消息从未被打印出来。几天来,我一直在努力弄清这件事的真相,所以我非常感谢您的帮助。

共有1个答案

杜高谊
2023-03-14

铁路公司将消息推送到主题“/topic/TRAIN\u MVT\u ALL\u 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"));
    ...
}

最好将传入和传出封装在定义的类中。这样,序列化和反序列化就更容易了。

资料来源:

  • https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/messaging/simp/SimpMessageSendingOperations.html
  • https://spring.io/guides/gs/messaging-stomp-websocket/
 类似资料:
  • 我正在开发一个利用websockets功能的Spring应用程序。为了使它更健壮,我使用了STOMP/SimpleBrokerMessageHandler,如文档中所述。一切进展顺利,我已经能够非常快速地连接javasctipt客户端,所以我转而使用“AndroidSync”库在Android客户端上工作。 我发现的事实是,Android客户端(我想其他客户端也是如此)在服务器处理订阅请求后没有收

  • 问题内容: 我正在使用Paho发送和接收mqtt消息。到目前为止,发送消息一直没有问题,我正在使用mosquitto接收消息。 现在,我想使用Java客户端读取消息,并且注意到关于接收消息的文档越来越少。 我实现了MqttCallback接口,但仍然无法弄清楚如何阅读已订阅的主题的消息。 到目前为止,这是我的源代码,我可以使用mosquitto_sub读取消息。 问题答案: 您将在代理有时间将消息

  • 一、STOMP协议介绍 STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。 STOMP协议的前身是TTMP协

  • 微信文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.addTemplate.html 组合模板并添加至帐号下的个人模板库 $tid = 563; // 模板标题 id,可通过接口获取,也可登录小程序后台查看获取 $kidLi

  • 开普勒消息目前分为三大类:公告,告警和通知。 通知中根据不同的操作事件类型,分为十几个事件。每个事件都跟项目操作相关。便于接收项目操作变更的通知。 分类 事件 公告 Alarm 告警 Proclaim 通知 Build,Apply,Audit,Delete,Rollback,Logging,Reboot,Command,Storage,Extend... 订阅界面: 用户中心,点击头像,下拉菜单→

  • 我正在使用Spring stomp websocket框架向客户机发送订阅消息。我们使用ActiveMQ作为消息代理,并使用stomp javascript客户机。Spring 4.1.5和在此体系结构中,消息是通过以下方式发送的: 我只看到一个客户机接收到消息,而另一个没有。通过阅读Spring文档,我了解到这是默认的行为。谁能告诉我我做错了什么。 多谢了。