Создайте очередь jms на брокере после первого доступа

Если вы хотите создать пункт назначения qpid для издателя сообщений в Spring Integration jms. В качестве примера я могу создать такую ​​очередь:

<bean id="theTestQueue" class="org.apache.qpid.client.AMQQueue">
    <constructor-arg name="address" value="testQueue" />
    <property name="create" value="ALWAYS"/>
    <property name="node">
        <bean class="org.apache.qpid.client.messaging.address.Node">
            <constructor-arg name="name" value="testQueue"/>
            <property name="durable" value="true"/>
        </bean>
    </property>
</bean>

После этого я установил эту очередь в адаптер канала:

<int:channel id="testChannel"/>
<int-jms:outbound-channel-adapter channel="testChannel" destination="theTestQueue" session-transacted="true"/>

Если издатель отправит первое сообщение, очередь будет создана на брокере сообщений.

Но что мне делать, если я хочу устанавливать очереди динамически?

<int:channel id="testChannel"/>   
<int-jms:outbound-channel-adapter destination-expression="headers.destination" channel="testChannel"/>

Издатель выглядит так:

@Publisher(channel = "testChannel")
public Message<?> sendMessage (Message<?> message, @Header("destination") String name) {
  return message;

}

Второй параметр метода издателя — это имя пункта назначения. Это работает, если я создаю очередь на стороне брокера, прежде чем отправлять сообщение. Моим текущим решением является создание jmx mbean до того, как издатель отправит первое сообщение. Но я хочу использовать jmx-соединения как можно меньше. Есть ли возможность создать очередь автоматически? А может с фабрикой без jmx...

Спасибо за помощь. :)


person Smoothi    schedule 27.03.2015    source источник


Ответы (1)


Как вы могли заметить, для атрибута destination требуется ссылка на компонент Destination (id). С другой стороны, destination-expression также можно оценить как объект Destination.

Если у вас есть определение bean-компонента org.apache.qpid.client.AMQQueue для всех ваших «динамических назначений», вам просто нужно улучшить свое выражение, чтобы получить соответствующий bean-компонент из контекста приложения.

destination-expression="@beanFactoryAccessor.get(headers.destination)"

где beanFactoryAccessor — это некоторый простой bean-компонент, в который вводится BeanFactory для вызова его getBean() с помощью предоставленного name.

person Artem Bilan    schedule 27.03.2015
comment
Вот в чем проблема, у меня нет определений. Мое приложение выполняет разные задачи. Задачи будут инициированы через графический интерфейс. Очереди должны создаваться в зависимости от идентификатора задачи. Например, если идентификатор задачи равен XYZ, очередь должна быть создана и названа testQueue.XYZ. Так что я не знаю, зачем нужны дестинации. - person Smoothi; 27.03.2015
comment
Но, может быть, я могу создать свою собственную QueueFactory и поместить ее в выражение назначения... я попробую :) - person Smoothi; 27.03.2015