我们在项目中使用WSO2和RabbitMQ。一个要求是RabbitMQ的消费者应该生成队列,以防它以前不存在。
我们制作以下代理(之前没有在Rabbit代理中创建“队列”队列):
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="AMQPProxy3" startOnLoad="true" trace="enable" transports="rabbitmq" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<log level="full"/>
<property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
<property name="FORCE_SC_ACCEPTED" scope="axis2" type="STRING" value="true"/>
<send>
<endpoint>
<address uri="http://localhost:8080/greeting"/>
</endpoint>
</send>
</inSequence>
<outSequence/>
<faultSequence/>
</target>
<parameter name="rabbitmq.queue.name">queue</parameter>
<parameter name="rabbitmq.connection.factory">AMQPConnectionFactory</parameter>
</proxy>
ESB引发以下异常:
TID:[ - 1] [] [2017-08-25 13:23:06,139] ERROR {org.apache.axis2.transport.rabbitmq.ServiceTaskManager} - 错误,连接已关闭AMQPProxy3,Listner id - 302 { org.apache.axis2.transport.rabbitmq.ServiceTaskManager} com.rabbitmq.client.AlreadyClosedException:由于通道错误,通道已经关闭;协议方法:#method(reply-code = 404,reply-text = NOT_FOUND - vhost中没有队列'queue'/',class-id = 50,method-id = 10)
在这种情况下,使用ESB的RabbitMQ使用者不会创建队列,以防它不存在。
但是,如果我们使用一个使用amqp-client-4.0.2.jar的Java项目(给我们提供Rabbit官方页面的Java库),那么消费者就可以创建队列。
package com.ing.rabbitmq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Send2 {
private final static String QUEUE_NAME = "queue";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "{\"id\":100,\"content\":\"Manolito\"}";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
channel.close();
connection.close();
}
}
我们是否可以让ESB创建队列,就像我们使用java客户端(amqp-client-4.0.2.jar)一样?
答案 0 :(得分:0)
我认为应该可以使用WSO2 ESB。 尝试在代理配置中设置以下属性。
<parameter name="rabbitmq.queue.autodeclare">true</parameter>
如果不起作用,请告诉我您正在使用的WSO2 ESB版本。