如何解决Spring Boot无法连接到docker容器内的rabbitmq ruuning ..而从浏览器中我可以访问rabbitmq控制台
“我使用以下命令创建了Rabbit-mq contaier”
docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management
“据我所知,任何来自localhost:8080的连接都将重定向到运行Rabbit-mq的容器15672。即使启动该容器,我也可以使用localhost:8080打开Rabbit-mq。” >
“但是我的spring boot应用程序无法连接到localhost:8080” “这是我遇到的错误”
2020-08-14 20:17:01.300 ERROR 15508 --- [:0:0:0:0:1:8080] c.r.c.impl.ForgivingExceptionHandler : An unexpected connection driver error occured
java.net.SocketException: Socket Closed
at java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_261]
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_261]
at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[na:1.8.0_261]
at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_261]
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) ~[na:1.8.0_261]
at java.io.BufferedInputStream.read(BufferedInputStream.java:265) ~[na:1.8.0_261]
at java.io.DataInputStream.readUnsignedByte(DataInputStream.java:288) ~[na:1.8.0_261]
at com.rabbitmq.client.impl.Frame.readFrom(Frame.java:91) ~[amqp-client-5.9.0.jar:5.9.0]
at com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:184) ~[amqp-client-5.9.0.jar:5.9.0]
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:665) ~[amqp-client-5.9.0.jar:5.9.0]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_261]
2020-08-14 20:17:01.307 ERROR 15508 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.amqp.AmqpTimeoutException: java.util.concurrent.TimeoutException] with root cause
java.util.concurrent.TimeoutException: null
at com.rabbitmq.utility.BlockingCell.get(BlockingCell.java:77) ~[amqp-client-5.9.0.jar:5.9.0]
at com.rabbitmq.utility.BlockingCell.uninterruptibleGet(BlockingCell.java:120) ~[amqp-client-5.9.0.jar:5.9.0]
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36) ~[amqp-client-5.9.0.jar:5.9.0]
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502) ~[amqp-client-5.9.0.jar:5.9.0]
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:326
“以下是我的application.properties文件”
spring.rabbitmq.host = localhost
spring.rabbitmq.port = 8080
spring.rabbitmq.username = guest
spring.rabbitmq.password = guest
server.port=8081
“以下是我的配置文件”
package com.example.connecttorabbitmqdocker.configuration;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Value("${javainuse.rabbitmq.queue}")
String queueName;
@Value("${javainuse.rabbitmq.exchange}")
String exchange;
@Value("${javainuse.rabbitmq.routingkey}")
private String routingkey;
@Bean
Queue queue() {
return new Queue(queueName,false);
}
@Bean
DirectExchange exchange() {
return new DirectExchange(exchange);
}
@Bean
Binding binding(Queue queue,DirectExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with(routingkey);
}
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
@Bean
public AmqpTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(jsonMessageConverter());
return rabbitTemplate;
}
}
“请提出您的任何建议”
解决方法
只有RabbitMQ的管理接口位于端口15672
下。您可以通过端口5672
访问AMQP协议。您可以这样做:
docker run -d --hostname my-rabbit --name some-rabbit -p 8080:5672 rabbitmq:3-management
并查看其连接方式。
,RabbitMQ通过端口5672和管理接口通过15672进行访问。因此,这两个端口都应公开以访问队列以及管理接口。 您可以执行以下命令来运行容器:
docker run -d --hostname my-rabbit --name some-rabbit -p 8080:5672 -p 8081:15672 rabbitmq:3-management
Java应用程序将通过8080访问rabbitmq(spring.rabbitmq.port = 8080),并且可以通过8081访问管理界面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。