Spring SimpMessagingTemplate

时间:2015-06-09 14:05:41

标签: spring rabbitmq spring-websocket spring-rabbit spring-messaging

我有一个从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的Queue Listener收到的消息(这也有效)并使用SimpMessagingTemplate将它们传递给Stomp WebSocket的特定上下文时我不能这样做。 SimpMessagingTemplate在dispatcher-servlet.xml中定义,但与RabbitMQ相关的配置在根上下文中。我试图将所有内容移动到一个上下文,但它不起作用。任何人都有类似的情况,我有一个?

1 个答案:

答案 0 :(得分:1)

我终于设法解决了这个问题。所以,基本上你需要将与Spring Messaging / WebSocket相关的bean移动到一个公共bean。

这就是为什么在我的根上下文中我有这样的界限:

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

包pl.garciapl.program.service.config位于负责配置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;
    }
}

请记住在您定义上述类的相同上下文中存储使用SimpMessagingTemplate的bean。