当前位置: 首页 > 知识库问答 >
问题:

无法从Spring Boot连接到rabbitmq STOMP

金高轩
2023-03-14

我使用了启用STOMP的RabbitMQ docker图像。通过以下配置,当我尝试运行我的Spring Boot Application时,我得到了一个异常。

StackTrace:

2020-11-21 16:03:07.620INFO 28504---[ient-low-nio-1]o. s. ms. s. s.会话系统中传输控制协议失败:连接失败:连接拒绝:/127.0.0.1:61613

io.netty.channel.AbstractChannel$AnnotatedConnectExcture:连接拒绝:/127.0.0.1:61613引起原因:java.net.ConnectExc0019:sun.nio.ch.SocketChannelImpl.checkConnect(本地方法)~[na: 1.8.0_242]atsun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:714)~[na: 1.8.0_242]在io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330)~[netty传输-4.1.51。final.jar:4.1.51。最终]在io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334)~[netty-transport-4.1.51。final.jar:4.1.51。最终]在io.netty.channel.nio.NioEventLoop.processSseltedKey(NioEventLoop.java:702)~[netty-transport-4.1.51。final.jar:4.1.51。最终]at io. netty. Channel. nio.NioEventLop. ProcSseltedKeysOptimated(NioEventLop. java: 650)~[netty-transport-4.1.51.最终. jar: 4.1.51。最终]at io. netty. Channel. nio.NioEventLop. ProcSseltedKeys(NioEventLop. java: 576)~[netty-transport-4.1.51.最终. jar: 4.1.51。最终]at io. netty. Channel. nio.NioEventLoop. run(NioEventLoop. java: 493)~[netty-transport-4.1.51.最终. jar: 4.1.51。最终]at io. netty. util.同时。SingleThreadEventExecutor4 Dollars. run(SingleThreadEventExecutor. java: 989)~[netty-通用-4.1.51。最终. jar: 4.1.51。最终]at io. netty. util. interal.ThreadExecutorMap2 Dollars. run(ThreadExecutorMap. java: 74)~[netty-colon-4.1.51.最终. jar: 4.1.51。最终]at io. netty. util.同时。FastThreadLocalRunnable. run(FastThreadLocalRunnable. java: 30)~[netty-通用-4.1.51。最终. jar: 4.1.51。最终]在java. lang.Thread. run(Thread. java: 748)~[na: 1.8.0_242]

Dockerfile

FROM rabbitmq:3-management
RUN rabbitmq-plugins enable --offline rabbitmq_stomp
EXPOSE 61613

Rabbitmq容器中的日志在我看来很好。

WebSocketConfig。java看起来像:

@EnableWebSocketMessageBroker
@Configuration
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws-connection")
            .setAllowedOrigins("*")
            .withSockJS();
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableStompBrokerRelay("/topic", "/queue")
            .setRelayPort(61613)
            .setRelayHost("127.0.0.1")
            .setClientPasscode("guest")
            .setClientLogin("guest");
    registry.setApplicationDestinationPrefixes("/ws");
}
}

pom.xml

    <dependency>
        <groupId>io.projectreactor.netty</groupId>
        <artifactId>reactor-netty</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
    </dependency>

配置有什么问题?有人能帮我吗?

共有1个答案

周高畅
2023-03-14

我认为您在为客户端公开rabbitmq stomp端口61613时犯了一个错误。顺便说一句,我用一个类似的配置进行了测试,它对我很有用。

有关实现,请检查GitHub上的演示应用程序或阅读以下详细信息。

Dockerfile

FROM rabbitmq:3-management

RUN rabbitmq-plugins enable --offline rabbitmq_stomp

EXPOSE 15671 15672 61613

服务器实现

消息契约

public class ZbytesMessage {

    private String from;
    private String text;

    ...getters and setters...

}

WebSocket配置

@Configuration
@EnableWebSocketMessageBroker
public class StompConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/zsockets")
                .setAllowedOrigins("*").withSockJS();
    }

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

网络控制器

@Controller
public class ZbytesController {

    private static final Logger LOG = LoggerFactory.getLogger(ZbytesController.class);

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public ZbytesMessage greeting(ZbytesMessage msg) throws Exception {
        Thread.sleep(1000); // simulated delay
        LOG.info("Received : {} from: {} ", msg.getText(), msg.getFrom());
        return msg;
    }
}

服务器运行程序

@SpringBootApplication
public class ServerRunner {

    public static void main(String[] args) {
        SpringApplication.run(ServerRunner.class, args);
    }

}

客户端实现

public class HelloClient {

    private static final WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
    private static final Logger LOG = LoggerFactory.getLogger(HelloClient.class);

    public static void main(String[] args) throws Exception {
        HelloClient helloClient = new HelloClient();

        ListenableFuture<StompSession> f = helloClient.connect();
        StompSession stompSession = f.get();

        LOG.info("Subscribing to greeting topic using session {}", stompSession);
        helloClient.subscribeGreetings(stompSession);

        LOG.info("Sending hello message {}", stompSession);
        helloClient.sendHello(stompSession);
        Thread.sleep(60000);
    }

    public ListenableFuture<StompSession> connect() {

        Transport webSocketTransport = new WebSocketTransport(new StandardWebSocketClient());
        List<Transport> transports = Collections.singletonList(webSocketTransport);

        SockJsClient sockJsClient = new SockJsClient(transports);
        sockJsClient.setMessageCodec(new Jackson2SockJsMessageCodec());

        WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);

        String url = "ws://{host}:{port}/zsockets";
        return stompClient.connect(url, headers, new MyHandler(), "localhost", 8080);
    }

    public void subscribeGreetings(StompSession stompSession) {
        stompSession.subscribe("/topic/greetings", new StompFrameHandler() {

            public Type getPayloadType(StompHeaders stompHeaders) {
                return byte[].class;
            }

            public void handleFrame(StompHeaders stompHeaders, Object o) {
                LOG.info("Received greeting {}", new String((byte[]) o));
            }
        });
    }

    public void sendHello(StompSession stompSession) {
        String jsonHello = "{ \"from\" : \"suraj\", \"text\" : \"Hi zbytes!\" }";
        stompSession.send("/zbytes/hello", jsonHello.getBytes());
    }

    private static class MyHandler extends StompSessionHandlerAdapter {
        @Override
        public void afterConnected(StompSession stompSession, StompHeaders stompHeaders) {
            LOG.info("Now connected");
        }
    }

}

要运行

  • 构建docker映像并运行它(不要忘记公开端口613)。(注意:我更喜欢docker compose.yaml)
docker build -t zbytes/rabbitmq .
docker run -p61613:61613 zbytes/rabbitmq
  • 运行ServerRunnerjava主类。 运行HelloClient java主类。

服务器输出

i.g.zbytes.demo.server.ZbytesController  : Received : Hi zbytes! from: suraj 

客户端输出

Received greeting {"from":"suraj","text":"Hi zbytes!"}
 类似资料:
  • 我正在尝试从Spring Boot应用程序连接到mySQL数据库。然而,当我试图运行它时,它显示出错误。 我如何解决这个问题? 错误 从我的文件中添加代码片段 pom。xml 应用属性 堆栈跟踪 我还没有在sql中手动创建表,因为我认为spring.jpa.hibernate.ddl-Auto=date应该这样做

  • 尝试使用主连接字符串和用户名(数据库名)连接到cosmosdb Mongo API 原因:com.mongodb.mongotieoutexception:在等待与com.mongodb.client.internal.mongoclientdelegate$1@3C291AAD匹配的服务器时,在30000 ms后超时。群集状态的客户端视图是{type=replica_set,servers=[{

  • 这是我的实体 这是我的主课 这就是我的persistence.xml 堆栈跟踪:

  • 我试图从Windows运行一个HBase Java客户端程序。我所拥有的只有1)一个没有任何编译器错误的Java程序2)hbase-site.xml(我没有其他HDFS或HBase配置文件。只有上面的一个。)当我运行程序时,我得到了以下错误--在最后一个块中给出的。我错过了什么吗?我在这里都给出了。

  • 我创建了一个docker compose文件,将MySql连接到SpringBoot应用程序。但我得到了这个错误: 我尝试在本地机器中使用docker默认ip运行Spring Boot应用程序,同时在这个docker-compose.yml文件中只运行MySql容器,结果运行得非常好。但当我尝试docker编写文件时。我知道这个错误。

  • 问题内容: 我在Mac OS 10.8.5上安装了docker-machine 0.1.0和docker-compose 1.1.0。 Docker-machine正常运行,并且能够通过docker-machine ssh连接。 但是无法从docker-compose连接。 无法通过http + unix://var/run/docker.sock连接到Docker守护程序-它正在运行吗? 如果它

  • 我在Mac OS 10.8.5上安装了docker-machine 0.1.0和docker-compose 1.1.0。 docker-machine运行正常,并且能够通过docker-machine SSH进行连接。 但无法从Docker-Compose连接。 无法连接到HTTP+UNIX上的Docker后台进程://var/run/Docker.sock-它正在运行吗? 如果它位于非标准位置

  • 我正在尝试将spring连接到MySQL。然而,我得到以下错误,谁能帮助? 应用程序.属性: spring.datasource.url=jdbc:mysql:/localhost/osworks?createdatabaseifNotexist=true&servertimezone=utc spring.datasource.username=root spring.datasource.da