【问题标题】:Java StompSession send Message - Spring BootJava StompSession 发送消息 - Spring Boot
【发布时间】:2019-05-03 14:54:55
【问题描述】:

我正在尝试在两个 Spring Boot 应用程序之间建立 websocket 连接;我在这里关注示例代码:https://github.com/eugenp/tutorials/blob/master/spring-boot-client/src/main/java/org/baeldung/websocket/client/MyStompSessionHandler.java

从中,这部分对我来说很好:

 @Override
    public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
   logger.info("New session established : " + session.getSessionId());
   session.subscribe("/topic/messages", this);
   logger.info("Subscribed to /topic/messages");
   session.send("/app/chat", getSampleMessage());
   logger.info("Message sent to websocket server");
}

但是,我不知道如何在 afterConnected 函数之外重用 session.send()。换句话说,我想要一个如下功能:

void sendMessage(String message){
    session.send("/app/chat", message);
}

【问题讨论】:

    标签: java spring spring-boot websocket stomp


    【解决方案1】:

    为了在 afterConnected 函数之外使用 Session.send。您需要存储调用时返回的 Session 变量。 StompClient.connect()

    喜欢

    StompSession session = stompClient.connect(URL, sessionHandler).get();

    并像使用它

    session.send("/app/chat", message);

    我希望这能回答你的问题

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我想在这篇文章中分享我的解决方案。我已经实现了一个配置类,它使用 bean 公开 StompSession,该 bean 可以作为服务注入到另一个组件中。

      @Configuration
      @RequiredArgsConstructor
      public class WebSocketClientConfig {
      
          private static final Logger logger = LoggerFactory.getLogger(WebSocketClientConfig.class);
      
          /**
           * Provide Stomp Session Handler
           *
           * @return
           */
          @Bean
          protected StompSessionHandler provideStompSessionHandler() {
              return new WebSocketStompSessionHandler();
          }
      
          /**
           * Provide WebSocket Client
           *
           * @return
           */
          @Bean
          protected WebSocketClient provideWebSocketClient() {
              return new StandardWebSocketClient();
          }
      
          /**
           * Provide StompSession session
           *
           * @param sessionHandler
           * @param webSocketClient
           * @return
           * @throws java.lang.InterruptedException
           * @throws java.util.concurrent.ExecutionException
           */
          @Bean
          protected StompSession provideStompSession(
                  final StompSessionHandler sessionHandler,
                  final WebSocketClient webSocketClient
          ) throws InterruptedException, ExecutionException {
              final WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient);
              stompClient.setMessageConverter(new MappingJackson2MessageConverter());
              return stompClient.connect("ws://localhost:8080/messages", sessionHandler).get();
          }
      }
      

      现在我可以在 afterConnection 之外使用 StomSession:

      @Service
      @RequiredArgsConstructor
      public class PublishMessageServiceImpl implements IPublishMessageService {
      
          /**
           * Stomp Session
           */
          private final StompSession stompSession;
      
          /**
           *
           * @param message
           */
          @Override
          public void publish(final PublishMessageDTO message) {
              Assert.notNull(message, "Message can not be null");
              stompSession.send("/topic/message", message);
          }
      
      }
      

      我希望它对某人有用,问候

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-05
        • 2020-11-13
        • 1970-01-01
        • 2018-10-05
        • 2018-07-21
        • 2020-11-16
        • 1970-01-01
        相关资源
        最近更新 更多