与SpringMessaging 5.x.x的Spring Boot ActiveMQ websocket STOMP连接

时间:2018-08-17 11:39:55

标签: spring spring-boot websocket activemq netty

我在将春季消息传递形式4.x.x更新为5.x.x时遇到问题。在较新的版本中,Reactor2TcpClientReactorNettyTcpClient取代了,这给我带来了麻烦。

这是我使用旧的春季消息传递的工作代码:

package com.example.websockets;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.broker.AbstractBrokerMessageHandler;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler;
import org.springframework.messaging.tcp.reactor.Reactor2TcpClient;
import org.springframework.web.socket.config.annotation.DelegatingWebSocketMessageBrokerConfiguration;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
class MyStompBrokerRelayMessageHandler extends DelegatingWebSocketMessageBrokerConfiguration {

    @Bean
    public AbstractBrokerMessageHandler stompBrokerRelayMessageHandler() {

        StompBrokerRelayMessageHandler handler = (StompBrokerRelayMessageHandler) super.stompBrokerRelayMessageHandler();

        handler.setTcpClient(new Reactor2TcpClient<>(
                new StompTcpFactory(
                "stompLink",
                stompPort,
                true)
        ));

        return handler;
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableStompBrokerRelay("/queue", "/topic")
                .setRelayHost("wssLink")
                .setRelayPort(wssPort)
                .setSystemLogin("adminLogin")
                .setSystemPasscode("adminPassword")
                .setClientLogin("clientLogin")
                .setClientPasscode("clientPassword");

        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    protected void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").withSockJS();
    }
}

package com.example.websockets;

import io.netty.channel.EventLoopGroup;
import org.springframework.messaging.Message;
import org.springframework.messaging.simp.stomp.Reactor2StompCodec;
import org.springframework.messaging.simp.stomp.StompDecoder;
import org.springframework.messaging.simp.stomp.StompEncoder;
import org.springframework.messaging.tcp.reactor.Reactor2TcpClient;
import reactor.Environment;
import reactor.core.config.ReactorConfiguration;
import reactor.io.net.NetStreams;
import reactor.io.net.Spec;
import reactor.io.net.config.SslOptions;
import reactor.io.net.impl.netty.NettyClientSocketOptions;

import java.util.Properties;

import static java.util.Collections.emptyList;

public class StompTcpFactory implements NetStreams.TcpClientFactory<Message<byte[]>, Message<byte[]>> {

    private final Environment environment;
    private final EventLoopGroup eventLoopGroup;
    private final String host;
    private final int port;
    private final boolean ssl;

    StompTcpFactory(String host, int port, boolean ssl) {
        this.host = host;
        this.port = port;
        this.ssl = ssl;
        this.environment = new Environment(() -> new ReactorConfiguration(emptyList(), "sync", new Properties()));
        this.eventLoopGroup = Reactor2TcpClient.initEventLoopGroup();
    }

    @Override
    public Spec.TcpClientSpec<Message<byte[]>, Message<byte[]>> apply(Spec.TcpClientSpec<Message<byte[]>, Message<byte[]>> tcpClientSpec) {
        return tcpClientSpec
                .env(environment)
                .options(new NettyClientSocketOptions().eventLoopGroup(eventLoopGroup))
                .codec(new Reactor2StompCodec(new StompEncoder(), new StompDecoder()))
                .ssl(ssl ? new SslOptions() : null)
                .connect(host, port);
    }

}

这是我的依赖项:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-messaging</artifactId>
        <version>4.3.13.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-core</artifactId>
        <version>2.0.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-net</artifactId>
        <version>2.0.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.28.Final</version>
    </dependency>

在我更新依赖关系的失败尝试中,我使用的是这个

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-messaging</artifactId>
        <version>5.0.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>io.projectreactor.ipc</groupId>
        <artifactId>reactor-netty</artifactId>
        <version>0.7.8.RELEASE</version>
    </dependency>

然后我替换了:

    @Bean
    public AbstractBrokerMessageHandler stompBrokerRelayMessageHandler() {

        StompBrokerRelayMessageHandler handler = (StompBrokerRelayMessageHandler) super.stompBrokerRelayMessageHandler();

        handler.setTcpClient(new Reactor2TcpClient<>(
                new StompTcpFactory(
                "stompLink",
                stompPort,
                true)
        ));

        return handler;
    }

具有:

    @Bean
    public AbstractBrokerMessageHandler stompBrokerRelayMessageHandler() {

        StompBrokerRelayMessageHandler handler = (StompBrokerRelayMessageHandler) super.stompBrokerRelayMessageHandler();

        handler.setTcpClient(new ReactorNettyTcpClient<>(
                    "stompLing",
                    stompPort,
                    new StompReactorNettyCodec(new StompDecoder(), new StompEncoder())));

        return handler;
    }

任何建议将不胜感激。

0 个答案:

没有答案