首次访问后在代理上创建 jms 队列

Create jms queue on broker after first access

如果要在 spring 集成 jms 上为消息发布者创建 qpid 目标。例如,我可以创建一个这样的队列:

<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;

}

publisher-method 的第二个参数是目的地的名称。如果我在发送消息之前在代理端创建队列,那将有效。我当前的解决方案是在发布者发送第一条消息之前由 jmx mbean 创建。但我想尽可能少地使用 jmx 连接。有机会自动创建队列吗?或者可能是没有 jmx 的工厂...

感谢您的帮助。 :)

您可能会注意到 destination 属性需要一个 Destination bean 引用 (id)。从另一边 destination-expression 也可以评估为 Destination 对象。

如果您有 org.apache.qpid.client.AMQQueue 所有那些 "dynamic destinations" 的 bean 定义,您只需要改进表达式以从应用程序上下文中获取适当的 bean

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

其中 beanFactoryAccessor 是一些简单的 bean,它被注入 BeanFactory 以通过提供的 name.

调用它的 getBean()