我在Spring Boot 2上通过Apache Camel连接到Rabbitmq时遇到问题。
我做了以下步骤:
我的依赖项:
implementation "org.apache.camel:camel-spring-boot-starter:${camelVersion}"
implementation "org.apache.camel:camel-jackson-starter:${camelVersion}"
implementation "org.apache.camel:camel-core:${camelVersion}"
implementation "org.apache.camel:camel-rabbitmq-starter:${camelVersion}"
implementation "org.springframework.boot:spring-boot-starter-amqp"
Application.yaml
spring:
rabbitmq:
dynamic: true
host: 192.168.1.1
port: 5672
username: X
password: Y
我有以下路线:
@Component
public class BasicRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:loggerQueue")
.id("loggerQueue")
.to("rabbitmq://TEST-QUEUE.exchange?queue=TEST-QUEUE.queue&autoDelete=false&connectionFactory=#rabbitConnectionFactory")
.end();
}
}
最后,我仍然遇到以下问题:
2019-03-06 12:46:05.766 WARN 19464 --- [restartedMain] o.a.c.c.rabbitmq.RabbitMQProducer:无法创建连接。发布消息时,它将尝试再次连接。 java.net.ConnectException:连接被拒绝:connect
连接似乎还可以,我对此进行了测试。 RabbitConnectionFactory不好。
我不知道我有什么不好。
答案 0 :(得分:1)
问题似乎是RabbitMQComponent期望找到类型为com.rabbitmq.client.ConnectionFactory的连接工厂。
但是,springboot自动配置正在创建类型为org.springframework.amqp.rabbit.connection.CachingConnectionFactory的连接工厂。
因此,每当RabbitMQComponent尝试查找适当的连接工厂时,由于它正在寻找特定的类型,并且因为它不对Rabbitmq ConnectionFactory进行子类化,因此它将返回空值,并且无法使用适当的主机名和您的application.yml中指定的配置参数。
You should also see the following in your log if you have debug level set:
2019-12-15 17:58:53.631 DEBUG 48710 --- [ main] o.a.c.c.rabbitmq.RabbitMQComponent : Creating RabbitMQEndpoint with host null:0 and exchangeName: asterix
2019-12-15 17:58:55.927 DEBUG 48710 --- [ main] o.a.c.c.rabbitmq.RabbitMQComponent : Creating RabbitMQEndpoint with host null:0 and exchangeName: asterix-sink
编辑: 作为自动配置的一部分,使用必需的Rabbit连接工厂配置了CachingConnectionFactory。但是,您需要提供指向正确工厂的链接。
因此,您需要添加一个@Bean来消除歧义。
@Configuration
@RequiredArgsConstructor
public class CamelConfig {
private final CachingConnectionFactory rabbitConnectionFactory;
@Bean
com.rabbitmq.client.ConnectionFactory rabbitSourceConnectionFactory() {
return rabbitConnectionFactory.getRabbitConnectionFactory();
}
}
并在您的端点配置中:
rabbitmq:asterix?connectionFactory=#rabbitSourceConnectionFactory
请注意,#是可选的,因为它在尝试查找Rabbit连接工厂bean时会在代码中剥离。
在application.yml中,配置连接参数(该URL不再包含在端点URI中)。
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest