SimpMessagingTemplate.convertAndSend не работает

#spring-boot #websocket #spring-websocket

#весенняя загрузка #websocket #весна-websocket

Вопрос:

Я пытаюсь отправить сообщение подписанному пользователю с помощью spring-starter-websocket, но похоже, что convertAndSend просто не отправляет сообщение. @SendTo работает.
Моя конфигурация:

 @Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

private final HttpHandshakeInterceptor httpHandshakeInterceptor;

public WebSocketConfig(HttpHandshakeInterceptor httpHandshakeInterceptor) {
    this.httpHandshakeInterceptor = httpHandshakeInterceptor;
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/websocket").setAllowedOrigins("*").withSockJS().setInterceptors(httpHandshakeInterceptor);
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/notifications");
    registry.setApplicationDestinationPrefixes("/app");
}
  

Контроллер:

 @Controller
public class NotificationController {

    private final NotificationService notificationService;
    private final SimpMessagingTemplate template;

    public NotificationController(NotificationService notificationService, SimpMessagingTemplate template) {
        this.notificationService = notificationService;
        this.template = template;
    }

    @MessageMapping("/echo")
    public void send(String text) {
        template.convertAndSend("/notifications", text);
    }
}
  

Тестовый пример:

 @Autowired
    NotificationService notificationService;

    @Test
    public void testSubscribe() throws ExecutionException, InterruptedException {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add("Authorization", "Bearer "   token);
        StompSession stompSession = stompClient.connect(WEBSOCKET_URI, new WebSocketHttpHeaders(httpHeaders),
                new StompSessionHandlerAdapter(){}).get();

        stompSession.subscribe(WEBSOCKET_TOPIC, new DefaultStompFrameHandler());

        stompSession.send("/app/echo", "Test".getBytes());
        Assert.assertEquals("Test", blockingQueue.poll(1, SECONDS));
    }

    class DefaultStompFrameHandler implements StompFrameHandler {
        @Override
        public Type getPayloadType(StompHeaders stompHeaders) {
            return byte[].class;
        }

        @Override
        public void handleFrame(StompHeaders stompHeaders, Object o) {
            blockingQueue.offer(new String((byte[]) o));
        }
    }
  

В результате у меня есть очередь эмиссии. @SentTo работает идеально.

UPD: convertAndSend работает, но только с контроллера.

P.S. Извините за мой английский, надеюсь, вы поняли проблему 🙂

Комментарии:

1. У меня такая же проблема. Я внедряю SimpMessagingTemplate в свои другие классы, и он не будет отправлен. Через @Controller класс это работает. Вы нашли решение или проблему?

2. Нет. Я опубликую решение здесь, когда найду его.