Spring SimpMessagingTemplate i context

0

Mam pewną aplikację napisaną w Springu, która odbiera wiadomości z RabbitMQ. Wszystko działa pięknie i ładnie, aczkolwiek skupmy się na części aplikacji, która rozsyła dane (JSON) na konkretne contexty dla WebSocketów z wykorzystaniem SimpMessagingTemplate. Poniższy kod działa tzn wysyła dane, które odbierane są przez frontend poprzez Stomp.

@Scheduled(fixedDelay = 5000)
public void volumeGraphData() {

    Random r = new Random();

    Graph graph = new Graph();
    graph.setVolume(r.nextInt(500));
    String json = gson.toJson(graph);

    MessageBuilder<byte[]> messageBuilder = MessageBuilder.withPayload(json.getBytes());
    simpMessagingTemplate.send("/" + volumeGraph, messageBuilder.build());
}

Najgorsza część jest taka, że nie mogę połączyć dwóch elementów. Owego brokera w postaci SimpMessagingTemplate oraz Queue Listenera dla RabbitMQ.

public class QueueListener extends AbstractAdaptableMessageListener {

    private final Logger logger = Logger.getLogger(getClass().getName());

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
    }

    public void onMessagePayload(Payload payload) {
        logger.info("Queue listener");
        logger.info(payload.toString());
    }
}

Queue listener jest w root context, natomiast moduł do wysyłania danych na Stomp Endpoint w dispatcher-servlet.xml czyli de facto MVC context. Próbowałem z pozycji Queue Listenera wysyłać wiadomości na EventBus od Guavy, ale też nie działa. Przenosiłem beany do jednego wspólnego contextu, ale też nie działa m.in. kontener nie podawał SimpMessagingTemplate. Wiecie co trzeba zrobić ?

0

Udało mi się poprzenosić MessageBrokerConfig, w którym konfiguruje WebSocketMessageBroker do root contextu oraz klasę odpowiedzialną za przesłanie wiadomości dalej na odpowiednie contexty dla frontendu. Cały flow przechodzi od odebrania wiadomości do jej przesłania dalej, aż do modułu, który właśnie ma to wysłać z wykorzystaniem SimpMessagingTemplate. Żadnego błędu a na frontendzie cisza... Wie może ktoś co tutaj trzeba poprawić ?

0

Udało się rozwiązać ten problem. Rozwiązanie problemu polegało na przerzuceniu niemalże wszystkich beanów związanych z Spring Messaging/WebSocket do jednego contextu. W moim root context mam oto taki zapis :

<context:component-scan base-package="pl.garciapl.program.service.config"/>

<!-- Fix for IntelliJ 13.1 https://youtrack.jetbrains.com/issue/IDEA-123964 -->
<context:component-scan base-package="org.springframework.web.socket.config"/>

gdzie w paczce service.config znajduje się klasa odpowiedzialna za konfigurację WebSocketów :

@Configuration
@EnableWebSocketMessageBroker
@Component("messageBroker")
public class MessageBrokerConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        stompEndpointRegistry.addEndpoint("/test").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry messageBrokerRegistry) {
    }

    @Override
    public void configureClientInboundChannel(ChannelRegistration channelRegistration) {
    }

    @Override
    public void configureClientOutboundChannel(ChannelRegistration channelRegistration) {
    }

    @Override
    public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
        messageConverters.add(new MappingJackson2MessageConverter());
        return false;
    }
}

Dodatkowo bean, który wykorzystuje SimpMessagingTemplate musi być również w root context.

1 użytkowników online, w tym zalogowanych: 0, gości: 1