关于jms:Spring Websphere MQ 7:如何在管理订阅上进行订阅?

Spring Websphere MQ 7 : how to subscribe on an administratively subscription?

我正在将spring和Websphere MQ一起使用来进行发布/订阅。
经过几次测试,我可以:

  • 通过API在主题上创建非持久订阅,并使用消息
  • 通过API在主题上创建持久订阅,并使用消息
  • 我现在的目标是订阅管理订阅。
    使用Websphere Explore,我创建了与本地队列关联的管理预订-> OK

    在我的应用程序中,我想订阅此管理预订。
    我正在使用与上面的步骤2相同的配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <!-- producer ibmConnectionFactory -->
    <bean id="ibmConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">
        <property name="transportType" value="1" />
        <property name="connectionNameList" value="myHostname(1414)" />
        <property name="channel" value="CH_CYD_CON" />
        <property name="clientId" value="client1" />
    </bean>

     <bean id="cachedConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="ibmConnectionFactory" />
    </bean>

     <bean id="emailListener" class="com.myapp.jms.listener.EmailListener">
    </bean>

    <bean id="smsListener" class="com.myapp.jms.listener.SMSListener">
    </bean>

     <jms:listener-container connection-factory="singleConnectionFactory" destination-type="durableTopic" transaction-manager="transactionManager"
        acknowledge="transacted" destination-resolver="jmsDestResolver" container-type="default" client-id="client1">
        <jms:listener id="newsEmailListener" destination="News" ref="emailListener" method="onMessage" subscription="EmailSubscription" />
        <jms:listener id="newsSmsListener" destination="News" ref="smsListener" method="onMessage" subscription="SMSSubscription" />
    </jms:listener-container>

    如果我没有创建预订,则此配置将在队列管理器中使用以下名称创建预订:

    1
    JMS:<Queue Manager>:<Client ID>:<subscription name>

    而且,我可以使用消息。

    现在,如果我已经在Websphere Explorer中创建了预订,我认为它可以使用相同的配置。
    实际上,结果是我在执行过程中没有错误,但是我无法使用消息。

    我正在按照本教程在我的MQ管理器中创建我的差异对象。

    所以,我的问题是:

    • 是否可以订阅管理上的订阅?
    • 如果是,如何用Spring做到这一点?
    • 如果没有,那么还有其他解决方案吗?

    我可以直接连接到与管理订阅相关联的队列,但是我认为这不是一个好的解决方案。


    由于在Spring框架下使用JMS与MQ通讯时,问题在于JMS旨在主要与完全托管的订阅一起使用,而订阅的创建是由客户端代码启动的。

    可以使用来自JMS的管理预订-密钥是在Explorer中正确创建预订名称,以匹配MQ JMS客户端正在创建的名称。

    该技术说明中的信息可用于描述语法。在您工作的情况下,查看JMS创建的动态订阅的名称也可能会有所帮助。如果碰巧已经有一个同名用户-JMS将重新打开该订阅。

    有一个开放的RFE使它更易于使用-请随时添加您的声音。


    管理订阅的目的是允许仅能够读取队列的应用程序接收有关主题发布的消息。这种预订应该由MQ管理员永久创建,以允许读取目标队列的应用程序获取在该预订所针对的主题上发布的消息。

    如果您的应用程序能够直接订阅主题,则不需要管理订阅即可接收消息。

    您可以通过PCF消息以编程方式创建管理预订(http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.ref.adm.doc/q087050_.htm),但您不需要。