我没有收到websocket消息(simpmessagingtemplate)

evrscar2  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(789)

我不能让我的ws工作。我编写了这个测试,当我使用simpmessagingtemplate时它仍然失败,但是当我使用stompsession.send时它可以工作。有人能帮我找出哪里出错了吗?
问题可能不在测试中,我无法使simpmessagingtemplate在任何服务中工作。

  1. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  2. @ExtendWith(MockitoExtension.class)
  3. public class WebSocketSpec {
  4. @LocalServerPort
  5. private Integer port;
  6. @Autowired
  7. private SimpMessagingTemplate simpMessagingTemplate;
  8. private WebSocketStompClient webSocketStompClient;
  9. @BeforeEach
  10. public void initialize(){
  11. webSocketStompClient = new WebSocketStompClient(new SockJsClient(List.of(new WebSocketTransport(new StandardWebSocketClient()))));
  12. }
  13. @Test @DisplayName("test subscription to /topic/plcs/connection-status")
  14. void testSubscriptionToPlcConnectionEndpoint() throws Exception{
  15. CountDownLatch latch = new CountDownLatch(1);
  16. webSocketStompClient.setMessageConverter(new MappingJackson2MessageConverter());
  17. StompSession stompSession = webSocketStompClient.connect("ws://localhost:" + port+"/api/ws", new StompSessionHandlerAdapter() {
  18. }).get(1, TimeUnit.SECONDS);
  19. stompSession.subscribe("/topic/plcs/connection-status", new StompFrameHandler() {
  20. @Override
  21. public Type getPayloadType(StompHeaders stompHeaders) {
  22. return String.class;
  23. }
  24. @Override
  25. public void handleFrame(StompHeaders stompHeaders, Object o) {
  26. latch.countDown();
  27. System.out.println("RECEIVED: "+o);
  28. }
  29. });
  30. //stompSession.send("/topic/plcs/connection-status", "SENT FROM TEST!!!");
  31. simpMessagingTemplate.convertAndSend("/topic/plcs/connection-status", "SENT FROM TEST!!!");
  32. if (!latch.await(5, TimeUnit.SECONDS)){
  33. fail("Message not received");
  34. }
  35. }
  36. }

我的ws配置如下:

  1. @Configuration
  2. @EnableWebSocketMessageBroker
  3. public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
  4. @Override
  5. public void configureMessageBroker(MessageBrokerRegistry config) {
  6. config.enableSimpleBroker("/queue", "/topic");
  7. config.setApplicationDestinationPrefixes("/app");
  8. }
  9. @Override
  10. public void registerStompEndpoints(StompEndpointRegistry registry) {
  11. registry.addEndpoint("/ws").withSockJS();
  12. }
  13. }
h7wcgrx3

h7wcgrx31#

所以,实际上有两个问题。。。
首先是您使用了错误的messageconverter( new MappingJackson2MessageConverter() 而不是 new StringMessageConverter() )
这个 simpMessagingTemplate.convertAndSend("/topic/plcs/connection-status", "SENT FROM TEST!!!"); 在客户端被订阅之前就被解雇了,我只是试着在它之前加上一些延迟 Thread.sleep(500); 而且成功了。

相关问题