是否可以从WSO2 ESB中以前不存在的代理创建新的RabbitMQ队列?

时间:2017-08-25 13:24:02

标签: proxy wso2 rabbitmq

我们在项目中使用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)一样?

1 个答案:

答案 0 :(得分:0)

我认为应该可以使用WSO2 ESB。 尝试在代理配置中设置以下属性。

<parameter name="rabbitmq.queue.autodeclare">true</parameter>

如果不起作用,请告诉我您正在使用的WSO2 ESB版本。