【问题标题】:Spring Websphere MQ 7 : how to subscribe on an administratively subscription?Spring Websphere MQ 7:如何订阅管理订阅?
【发布时间】:2016-01-09 04:15:04
【问题描述】:

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

  1. 通过 API 在主题上创建非持久订阅并使用消息
  2. 通过 API 创建主题的持久订阅并使用消息

我现在的目标是订阅管理订阅。 使用 Websphere Explore,我创建了与本地队列关联的管理订阅 -> 好的

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

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

如果我不创建订阅,此配置将在队列管理器中使用此名称创建订阅:

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

而且,我可以消费消息。

现在,如果我在 Websphere Explorer 中创建了订阅,我认为相同的配置也可以正常工作。 其实结果是我在执行过程中没有报错,但是我消费不了消息。

我正在关注这个tutorial,以便在我的 MQ 管理器中创建我的不同对象。

所以,我的问题是:

  • 是否可以以管理方式订阅?
  • 如果是,如何使用 Spring 来做到这一点?
  • 如果不是,还有哪些其他解决方案?

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

【问题讨论】:

    标签: spring jms ibm-mq subscribe


    【解决方案1】:

    由于在 Spring 框架下使用 JMS 与 MQ 通信,问题在于 JMS 主要设计用于完全托管的订阅,其创建由客户端代码启动。

    可以使用来自 JMS 的管理订阅 - 关键是在 Explorer 中正确创建订阅名称以匹配 MQ JMS 客户端正在创建的内容。

    technote 中提供了用于描述语法的信息。如果您有工作,查看 JMS 创建的动态订阅的名称也会很有帮助。如果碰巧已经有一个同名 - JMS 将重新打开该订阅。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 感谢您的回答。如果我理解得很好,如果订阅是通过管理方式创建的,我就无法订阅它。我可以直接在与此订阅关联的队列上阅读消息吗?
      • 您订阅的是主题,而不是订阅。是的,一旦管理员创建了管理订阅,您的应用程序就可以从目标队列中读取消息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多