spring - Spring集成方法发送WebSocket消息时不广播

标签 spring websocket spring-integration

我在 Spring 组件中有一个方法,它从 Spring Integration channel 接收消息。收到消息后,会将其发送到 WebSocket 端点。这是行不通的。该消息未广播。

this.messagingTemplate.convertAndSend("/topic/update", dto);

但是,当我将相同的代码放入 Web Controller 中并在其上放置 RequestMapping 并调用该端点时,它就可以工作了。消息已广播。

当 Spring 集成执行器调用它时,什么可能导致它无法工作?

工作时:.14:01:19.939 [http-nio-8080-exec-4] 调试 o.s.m.s.b.SimpleBrokerMessageHandler - 处理消息目的地=/topic/update session=null 负载={XXX} .14:01:19.939 [http-nio-8080-exec-4] 调试 o.s.m.s.b.SimpleBrokerMessageHandler - 广播到 1 个 session 。

当它不起作用时,第二条消息不存在。 (线程是taskExecutor-1而不是http-nio..)

Controller 代码:

@RequestMapping("/testreq")
public void updateDelta() {
    SummaryDTO dto = new SummaryDTO();
    dto.setValue(-5000.0);
    dto.setName("G");

    this.messagingTemplate.convertAndSend("/topic/update", dto);

}

//this method is called by Spring Integration
//created by serviceActivator = new 
//ServiceActivatingHandler(webcontroller,"update");
public void updateDelta(SummaryDTO dto) {       
  this.messagingTemplate.convertAndSend("/topic/update", dto);

 }

消息发送:

synchronized(this){
...

this.updatedcontrollerchannel.send(MessageBuilder.withPayload(summarydto).build( )); }

channel 创建:

updatedchannel = new DirectChannel();
updatedchannel.setBeanName("updatedcontroller");

serviceActivator = new ServiceActivatingHandler(detailService,"update");
handlerlist.add(serviceActivator);
updatedchannel.subscribe(serviceActivator);
beanFactory.registerSingleton("updatedcontroller", channel);

更新 我将 spring 消息传递源代码添加到我的环境中并实现了以下内容: 运行时中有 2 个 SimpleBrokerMessageHandler 类的实例。对于工作副本,订阅注册表有 1 个条目,对于非工作副本,它有 0 个订阅。这是否为问题的根本原因提供了线索?仅定义了一个 MessageSendingOperations 变量,并且它位于 Controller 上。

最佳答案

我找到了问题的原因。具有 @EnableWebSocketMessageBroker 注释的类被加载两次,并导致创建两个 SimpleBrokerMessageHandler 实例。 @Artem Bilan:感谢您的宝贵时间。

关于spring - Spring集成方法发送WebSocket消息时不广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47079043/

相关文章:

android - 如何在我的 Android 项目中使用 Spring 框架?

java - 使用@ControllerAdvice 测试@RestController

Qt-webkit WebSocket协议(protocol)

python - 带有MQTT或Redis的Websockets?

java - 使用 FileWritingMessageHandler 的资源加载器

java - spring mvc属性文件中linux home的路径

java - @BeforeAll 和 @Transaction 不起作用 - 数据库端的更改不会回滚

C# websocket 本地和远程端点

java - Spring集成中的Session存储以及处理多个http出站网关

spring-integration - 带有错误 channel 的 Spring Integration 异步网关导致线程停顿