#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. Нет. Я опубликую решение здесь, когда найду его.