JHipster微服务websocket发送消息到'/ topic'

时间:2018-02-07 15:52:31

标签: rabbitmq jhipster spring-websocket spring-rabbitmq

我们有一个带有websockets的JHipster微服务应用程序。目前,主要的微服务(带前端)是通过依赖RabbitMQ作为主题的中继的websockets发送/接收消息的人。我们已经配置了Spring WebSockets + RabbitMQ,如本博文中所述:http://djeison.me/2017/11/04/spring-websocket-rabbitmq/

如果我还将其他微服务配置为转发到同一个RabbitMQ实例,我可以从我的架构中的其他微服务向主题发送消息吗?

修改

这是Spring Websockets在RabbitMQ上中继的配置类。这是主要的微服务,其中有STOMP WebSockets和前端Angular应用程序:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config
            .setApplicationDestinationPrefixes("/app")
            .enableStompBrokerRelay("/topic")
            .setRelayHost("localhost")
            .setRelayPort(61613)
            .setClientLogin("guest")
            .setClientPasscode("guest");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket-app").withSockJS();
    }

}

我的问题是,如果我在另一个微服务中复制此配置,它是否能够到达前端应用程序?它会与RabbitMQ共享相同的WebSocket连接吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

  

我的问题是我是否可以在另一个配置中复制此配置   微服务能否访问前端应用程序?

答案是肯定的,但是请在下面查看一些说明。

  

它将共享与RabbitMQ相同的WebSocket连接吗?

不,不会。任何其他微服务都必须连接并向RabbitMQ发送消息。

以下是一些从“网关”应用程序外部向网络套接字发送消息的选项:

  1. 设置中继代理中继并使用SimpMessagingTemplate spring-messaging

请注意,您不需要脚踏端点,仅需要代理中继。因此配置可以是:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("/topic")
    }
}

要发送消息:

simpMessagingTemplate.convertAndSend(“ / topic / route”,有效负载);

如果您的有效载荷是一个对象,并且应将其序列化为json,则可以将Jackson添加为依赖项,在这种情况下,AbstractWebSocketMessageBrokerConfigurer将为您创建一个json转换器(它还支持Stringbyte[]开箱即用。

  1. 使用RabbitTemplate spring-amqp

使用spring-boot-starter-amqp作为依赖项的示例配置:

@Configuration
public class RabbitConfiguration {

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        Jackson2JsonMessageConverter messageConverter = new 
        Jackson2JsonMessageConverter();
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(messageConverter);
        return rabbitTemplate;
    }
}

发送消息:

rabbitTemplate.convertAndSend("amq.topic", "route", payload);
  1. 如评论中所述,我们可以使用StompSession spring-integration-stomp

具有spring-integration-stomp作为依赖项的配置:

@Configuration
@EnableIntegration
public class StompConfiguration {

    @Bean
    public ReactorNettyTcpStompClient stompClient() {
        ReactorNettyTcpStompClient stompClient = new ReactorNettyTcpStompClient("127.0.0.1", 61613);
        stompClient.setMessageConverter(new MappingJackson2MessageConverter());
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.afterPropertiesSet();
        stompClient.setTaskScheduler(taskScheduler);
        stompClient.setReceiptTimeLimit(5000);
        return stompClient;
    }

    @Bean
    public StompSessionManager stompSessionManager() {
        ReactorNettyTcpStompSessionManager stompSessionManager = new ReactorNettyTcpStompSessionManager(stompClient());
        stompSessionManager.setAutoReceipt(true);
        return stompSessionManager;
    }
}

发送消息:

stompSessionManager.connect(new StompSessionHandlerAdapter() {
    @Override
    public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
        session.send("/topic/route", messageDto);
    }
});

这是一个Github repo,带有“网关”应用程序的工作示例,在该示例中建立了Web套接字连接,并使用上述3种方法将单独的应用程序发送消息到RabbitMQ“ websocket队列”。它还解决了有关用户/会话目标的一些问题。