【问题标题】:How to connect queue managers for WebSphere MQ 7.0 distributed publish/subscribe如何为 WebSphere MQ 7.0 分布式发布/订阅连接队列管理器
【发布时间】:2012-03-19 03:03:10
【问题描述】:

与往常一样,IBM 文档非常适合它告诉您的内容,但忽略了重要的细节。抱歉,如果这里已经回答了这个问题 - 不幸的是,搜索词大多是通用的或至少是模棱两可的,我已经浏览了几百个问题,但没有运气。

我有两台 (IBM i) 服务器,每台服务器都有一个 WMQ 7.0 队列管理器。我有两个通道在它们之间运行 - 每个方向一个。

我在“服务器 A”上定义了一个主题,其发布和订阅范围为“全部”,代理订阅行为为“强制”。

我在“服务器 B”上定义了一个订阅,范围为“全部”。

一切都已启动并正在运行,但是当我将消息放入服务器 A 上的主题时(使用 MQ 资源管理器),服务器 B 上什么也没有出现。

我已经阅读了完成这项工作所需的“代理订阅”,但我终生无法弄清楚这些是如何创建的。

任何帮助表示赞赏。我在几个小时内就走了这么远(以前从未使用过 pub/sub),只是为了克服这个障碍。

您必须在这两个队列管理器之间设置层次结构,以便发布流向 B 上的队列管理器。

您必须在这两个队列管理器之间设置层次结构,以便发布流向 B 上的队列管理器。

假设 A 上的队列管理器为父级,B 上的队列管理器为子级,您必须在 B 上的队列管理器的 RUNMQSC 提示符中发出“ALTER QMGR PARENT ()”。这将在两个队列管理器之间创建层次结构。在 B 上的队列管理器上创建订阅后,代理订阅将自动流向 A 上的队列管理器。假设 A 上的队列管理器为父级,B 上的队列管理器为子级,您必须发出“ALTER QMGR PARENT ()” B 上队列管理器的 RUNMQSC 提示符。这将在两个队列管理器之间创建层次结构。在 B 上的队列管理器上创建订阅后,代理订阅将自动流向 A 上的队列管理器。

编辑:关于我的配置的更多详细信息(对我来说更有意义的服务器名称)

在服务器 A7 上:

Queue manager A7.QUEUE.MANAGER 
Sender channel A7.TO.A2 with transmission queue A7.TO.A2 
Alias queue A2.QUEUE.MANAGER pointing to A7.TO.A2 
Receiver channel A2.TO.A7 

在服务器 A2 中:

Queue manager A2.QUEUE.MANAGER 
Sender channel A2.TO.A7 with transmission queue A2.TO.A7 
Alias queue A7.QUEUE.MANAGER pointing to A2.TO.A7 
Receiver channel A7.TO.A2 
I then issued ALTER QMGR PARENT('A7.QUEUE.MANAGER') 

我在 A7 上有主题,在发出 ALTER(上图)后,我在 A2 上添加了对该主题的订阅。

display pubsub type(ALL)                               
3 : display pubsub type(ALL)                      
AMQ8723: Display pub/sub status details.               
QMNAME(A2.QUEUE.MANAGER) TYPE(LOCAL) 

display pubsub type(ALL)                               
1 : display pubsub type(ALL)                      
AMQ8723: Display pub/sub status details.               
QMNAME(A7.QUEUE.MANAGER) TYPE(LOCAL) 

【问题讨论】:

    标签: proxy distributed ibm-mq publish-subscribe


    【解决方案1】:

    集群两个 QMgrs 并将主题通告给集群。然后,WMQ 将在整个集群中提供发布。

    QMGR01

    # Make the QMgr a cluster repository
    ALTER QMGR REPOS('CLUSTERNAME')
    
    # Create CLUSRCVR and advertise to cluster
    # Substitute your CONNAME parms, QMgr name, channel names, etc.
    DEF CHL(CLUSTERNAME.QMGR01) CHLTYPE(CLUSRCVR) +
        TRPTYPE(TCP) +
        CONNAME('127.0.0.1(1414)') +
        CLUSTER('CLUSTERNAME') +
        REPLACE
    
    # Create topic object and advertise to cluster
    DEF TOPIC('ROOT') TOPICSTR('ROOT') CLUSTER('CLUSTERNAME') REPLACE
    

    QMGR02

    # Always create CLUSRCVR first and advertise to cluster
    # Substitute your CONNAME parms, QMgr name, channel names, etc.
    DEF CHL(CLUSTERNAME.QMGR02) CHLTYPE(CLUSRCVR) +
        TRPTYPE(TCP) +
        CONNAME('127.0.0.1(1415)') +
        CLUSTER('CLUSTERNAME') +
        REPLACE
    
    # Then conecct to the repos and advertise the CLUSSDR to the cluster too
    # Substitute your CONNAME parms, QMgr name, channel names, etc.
    DEF CHL(CLUSTERNAME.QMGR01) CHLTYPE(CLUSSDR) +
        TRPTYPE(TCP) +
        CONNAME('127.0.0.1(1414)') +
        CLUSTER('CLUSTERNAME') +
        REPLACE
    

    现在您可以发布到已发布到集群的主题:

    在 QMgr01 上

    amqspub ROOT/Whatever QMGR01
    

    在 QMgr02 上

    amqssub ROOT/Whatever QMGR02
    

    您不必将对象命名为 ROOT 或将其用作主题命名空间的顶部。这是一个随意的例子,你可以使用任何你想要的东西。在生产环境中,您可能会在主题层次结构的第 2 或第 3 级有一些主题对象来挂起访问控制列表。通常,正是这些对象用于向集群通告主题。

    一些补充说明:

    • 您不能将SYSTEM.BASE.TOPICSYSTEM.DEFAULT.TOPIC 通告给集群。
    • 集群主题只需要在集群中的一个节点上定义。它可以是任何节点,但最好在主完整存储库上发布它。这样一来,您就可以知道所有集群主题对象在哪里定义,并且存储库是(或应该是)高度可用的。
    • 如果存在重叠的本地主题对象和集群主题对象,则本地主题对象优先。

    请参阅 Creating a new cluster topic 了解更多信息。此外,Creating and configuring a queue manager cluster 具有创建集群并将 QMgrs 添加到其中的任务。然而,我在我的 Windows 主机上测试了上述内容,在这个最小的集群中,pub/sub 运行良好。

    【讨论】:

    • 谢谢。我希望暂时不要走集群路线,但如果我这样做,我肯定会参考您的出色信息。
    【解决方案2】:

    您必须在这两个队列管理器之间设置层次结构,以便发布流向 B 上的队列管理器。

    假设 A 上的队列管理器为父级,B 上的队列管理器为子级,您必须在 B 上的队列管理器的 RUNMQSC 提示符中发出“ALTER QMGR PARENT ()”。这将在两个队列管理器之间创建层次结构。在 B 上的队列管理器上创建订阅后,代理订阅将自动流向 A 上的队列管理器。

    【讨论】:

    • 谢谢。这应该足以让我提出的方案发挥作用(其中有一个明确定义的发布系统,其余的将是订阅者)。但在一般意义上,这是否意味着订阅也会以另一种方式流动?我们有多个开发/测试框,让每个框订阅对方的出版物可能会很有用。
    • 还是有些不对劲。考虑到这种层次结构,我做了更多的阅读。我意识到我需要添加一个具有外部队列管理器名称的别名队列,以便本地队列管理器可以找到它,但我仍然看不到订阅正在传播(我希望将其视为父级的订阅条目?) 并且测试发布消息也没有通过。
    • 是的,代理订阅也会以另一种方式流动。
    • 我在本地盒子上设置了一个层次结构,效果很好,我可以在子 qmgr 接收出版物。两个 qmgrs,MQP 和 MQC。 MQP 是父级,并且在两个 qmgrs 上都设置了发送方通道,并启用了通道的自动定义。以 MQP 作为父级的 MQC 的更改父级。使用 amqspub 和 amqssub 示例应用程序,我可以发布消息是 MQP 并在 MQC 接收相同的消息。
    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2012-10-05
    相关资源
    最近更新 更多