Spring SimpMessagingTemplate

У меня есть приложение, которое получает некоторые данные от RabbitMQ. Все работает нормально, я имею в виду в классе, где у меня есть аннотация @EnableScheduling.

@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());
}

Но когда я хочу обработать сообщения, полученные прослушивателем очереди от RabbitMQ (это тоже работает), и передать их в определенный контекст для Stomp WebSocket с помощью SimpMessagingTemplate, я не могу этого сделать. SimpMessagingTemplate определен в файле dispatcher-servlet.xml, но конфигурация, связанная с RabbitMQ, находится в корневом контексте. Пробовал переместить все в один контекст, но не получается. У кого-нибудь есть такой же случай, как у меня?


person Lukasz Ciesluk    schedule 09.06.2015    source источник
comment
это не работает, это совсем не помогает; нужно описать симптомы. Вы должны иметь возможность просто переместить SimpMessagingTemplate в корневой контекст.   -  person Gary Russell    schedule 09.06.2015
comment
Да, вы правы ;) Я имею в виду, что я не могу передать свое сообщение, полученное от RabbitMQ, в одну из конечных точек Stomp, чтобы увидеть это сообщение от Frontend. Конфигурация WebSocket будет в контексте DispatcherServlet, и невозможно внедрить SimpMessagingTemplate в bean-компоненты в корневом контексте.   -  person Lukasz Ciesluk    schedule 09.06.2015
comment
Я должен добавить, что я переместил некоторый bean-компонент из disaptcher-servlet.xml в корневой контекст, и этот поток наконец-то работает. Я имею в виду, что Queue Listener получает сообщение от RabbitMQ, а затем отправляет его в класс, где аннотируется SimpMessagingTemplate. Сообщение было отправлено и... в интерфейсе ничего не произошло....   -  person Lukasz Ciesluk    schedule 09.06.2015


Ответы (1)


Наконец-то мне удалось это исправить. Итак, в основном вам нужно переместить свои компоненты, связанные с Spring Messaging/WebSocket, в один общий компонент.

Вот почему в моем корневом контексте у меня есть такие строки:

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

where in package pl.garciapl.program.service.config is located class responsible for configuration of WebSockets :

@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;
    }
}

Не забудьте хранить свои bean-компоненты, использующие SimpMessagingTemplate, в том же контексте, в котором вы определили этот класс выше.

person Lukasz Ciesluk    schedule 11.06.2015