Получение исключения при передаче сообщения из одной очереди в другую в муле с использованием rabbitmq

Я запускаю поток в муле с 3 очередями (rabbitmq). Вот моя конфигурация xml

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:amqp="http://www.mulesoft.org/schema/mule/amqp" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" version="EE-3.4.1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/amqp http://www.mulesoft.org/schema/mule/amqp/current/mule-amqp.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd">
    <amqp:connector name="AMQP_Connector1" validateConnections="true" fallbackAddresses="localhost:5672" doc:name="AMQP Connector1"/>
    <flow name="putToQueue1" doc:name="putToQueue1">
        <http:inbound-endpoint exchange-pattern="one-way" host="localhost" port="8081" path="message" doc:name="HTTP"/>
        <set-payload value="#[message.inboundProperties['msg']]" doc:name="Set Payload"/>        
            <processor-chain doc:name="Processor Chain">
                <amqp:outbound-endpoint queueName="test.queue1" responseTimeout="10000" doc:name="AMQP1" connector-ref="AMQP_Connector1"/>
                <custom-processor class="CustomProcessor" doc:name="Custom Processor"/>
                <amqp:outbound-endpoint queueName="test.queue2" responseTimeout="10000" doc:name="AMQP2" connector-ref="AMQP_Connector1"/>
                <custom-processor class="CustomProcessor" doc:name="Custom Processor"/>
                <amqp:outbound-endpoint queueName="test.queue3" responseTimeout="10000"  doc:name="AMQP3" connector-ref="AMQP_Connector1"/>
           </processor-chain>       
    </flow>
</mule>

Вот класс Java CustomProcessor

import org.mule.api.MuleEvent;
import org.mule.api.MuleException;
import org.mule.api.processor.MessageProcessor;


public class CustomProcessor implements MessageProcessor {

    @Override
    public MuleEvent process(MuleEvent event) throws MuleException {
        String message = (event.getMessage().getPayload() +" "+ System.currentTimeMillis());
        event.getMessage().setPayload(message);
        return event;
    }

}

Когда я нажимаю URL-адрес в браузере (используя конечную точку http), 1 сообщение доставляется queue3 через queue1 и queue2. Сначала сообщение помещается в queue1, который передает его в queue2, а затем queue2 в queue3. После передачи сообщения в другую очередь предыдущая очередь не должна сохранять сообщение. Но когда я нажимаю URL во второй раз. Я получаю следующее исключение

Caused by: java.lang.LinkageError: loader (instance of  org/mule/module/launcher/plugin/MulePluginsClassLoader): attempted  duplicate class definition for name: "org/mule/transport/amqp/AmqpMuleMessageFactory"
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    ..............

person Anand    schedule 07.03.2014    source источник
comment
Возможно, какие-то проблемы, связанные с конкретной версией, или детали конфигурации? Я не смог воспроизвести это исключение в Studio 3.5.0 на Centos 6.4, без Maven.   -  person Anton Kupias    schedule 08.03.2014


Ответы (1)


Вы пытаетесь воссоздать уже существующую очередь. Думайте об этом так, как будто у вас есть queue1 на сервере, а затем вы снова пытаетесь создать эту очередь. RabbitMQ не знает, ошибка это или вы явно хотите это сделать. Во втором случае вам нужно передать флаг passive при создании очереди.

взгляните здесь: https://www.rabbitmq.com/amqp-0-9-1-reference.html

немного пассивный

Если установлено, сервер ответит Declare-Ok, если очередь с таким же именем уже существует, и выдаст ошибку, если нет. Клиент может использовать это, чтобы проверить, существует ли очередь, без изменения состояния сервера. Если установлено, все остальные поля метода, кроме name и no-wait, игнорируются. Объявление с пассивным и без ожидания не имеет никакого эффекта. Аргументы сравниваются на предмет семантической эквивалентности.

person Vor    schedule 10.03.2014