我目前正在尝试用Talend open studio for ESB为RabbitMQ队列构建一个消费者。在阅读了我能找到的关于这个话题的每一个帖子后,我有两个不同的版本,但没有一个真正有效。
版本 1:
我的路线:
cMessagingEndpoint Route
cMessagingEndpoint1 URI:
“rabbitmq://host:port/exchange?username=xxxxx
我也尝试添加持久=true和no_declare=true到这个URI,但是我收到一个未知参数错误。所以我再次删除了这两个。
消息endpointURI
cMessagingEndpoint Camel组件
控制台输出:这似乎是旧语法,驱动程序错误导致连接关闭。
控制台输出
[WARN ] 09:29:07 org.apache.camel.component.rabbitmq.RabbitMQComponent- The old syntax rabbitmq://hostname:port/exchangeName is deprecated. You should configure the hostname on the component or ConnectionFactory
[WARN ] 09:29:08 com.rabbitmq.client.impl.ForgivingExceptionHandler- An unexpected connection driver error occured (Exception message: Connection reset)
[WARN ] 09:29:08 org.apache.camel.component.rabbitmq.RabbitConsumer- Unable to open channel for RabbitMQConsumer. Continuing and will try again
我假设驱动程序错误可能是由于我没有发送“持久:真实,no_declare:true”引起的,但我不确定在哪里添加这2个选项。
版本 2:
二号干线
我的连接工厂
cMQConnectionFactory设置
定义的实际队列。
cAMQ设置
包括durable和no_declare。这些必须被定义,否则我永远无法连接到RabbitMQ服务器
cAMQ高级设置
但我再次收到未知参数错误。
org.apache.camel.FailedToCreateRouteException: Failed to create route test_receiveMQMessage_cAMQP_1: Route(test_receiveMQMessage_cAMQP_1)[[From[cMQConnectionFact... because of Failed to resolve endpoint: cMQConnectionFactory1://queue:arcplace?durable=true&no_declare=true due to: Failed to resolve endpoint: cMQConnectionFactory1://queue:arcplace?durable=true&no_declare=true due to: There are 2 parameters that couldn't be set on the endpoint. Check the uri if the parameters are spelt correctly and that they are properties of the endpoint. Unknown parameters=[{durable=true, no_declare=true}]
有人知道如何解决此问题并将我的侦听器连接到RabbitMQ队列吗?
谢谢
编辑:
为了测试并确保连接是可能的,我创建了一个ruby脚本来将消息发布到交换机并使用发送到队列的消息。这没有任何问题。
我仍在努力使这条路线/工作行得通。
编辑2:
我检查了RabbitMQ代理的设置。这是一个基本安装,支持TLS上的AMQP 0.9.1。不支持AMQP 1.0或MQTT。
要继续使用AMQP 0.9,您必须将cMessagingEndpoint
与Rabbitmq url(带有连接工厂bean的新语法)一起使用:
< code>rabbitmq:myexchange?queue=myqueue
您必须注册一个连接工厂bean,骆驼将使用cBeanPost
自动检测到它。我使用全局bean实例来传递上下文变量,如主机、用户等。cBeanPost以简单模式配置,类名为beans.RabbitConnectionFactory
并具有单个参数“上下文”(它是您的属性上下文)。您可以根据需要指定bean id。
public class RabbitConnectionFactory extends ConnectionFactory {
public RabbitConnectionFactory(Properties properties) {
setHost(properties.getProperty("amqp_host"));
setPort(Integer.parseInt(properties.getProperty("amqp_port")));
setUsername(properties.getProperty("amqp_user"));
setPassword(properties.getProperty("amqp_password"));
}
}