1

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

4

1 回答 1

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 存储在您定义上述类的相同上下文中。

于 2015-06-11T13:20:18.027 回答