DefaultMessageListenerContainer,关于要侦听的队列的知识

时间:2012-09-18 05:43:50

标签: java spring queue jms spring-jms

是否有可能在onMessage方法中知道MessageListener正在侦听哪个队列?

我的Spring-config(其中一部分):

<bean id="abstractMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer" abstract="true">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="maxConcurrentConsumers" value="5"/>
    <property name="receiveTimeout" value="10000" />
</bean>

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer" parent="abstractMessageListenerContainer">
    <property name="destinationName" value="MY.QUEUE" />
    <property name="messageListener" ref="myMessageListener" />
</bean>

<bean id="myMessageListener" class="my.package.structure.ListenerClass"></bean>

我的听众课程:

public class ListenerClass implements MessageListener {


    public void onMessage(Message msg) {

    //where do I know from, on which queue the message has been written to?

    }

}

有没有开箱即用的解决方案?或者任何获取队列/目标名称的自定义解决方案?

在后续批处理中需要队列......

1 个答案:

答案 0 :(得分:3)

易。至少在琐碎的情况下:

msg.getJMSDestination()将为您提供javax.jms.Destination对象的目标。通常,.toString()会返回类似:queue://MYQUEUENAME

的内容

但是,在某些JMS实现中,可能存在多跳队列,例如WebSphere MQ中的静态发布/订阅设置,您可以在其中将消息写入一个队列,并且它将在路径周围反弹以完全不同的方式结束队列。此外,您可能会遇到一个ESB,其中间的逻辑用于路由消息。在这种情况下,在依赖JMSDestination属性之前,您需要三思而后行。否则,请继续。