【问题标题】:Connecting IBM MQ queue using F5 virtual ip and C++使用 F5 虚拟 IP 和 C++ 连接 IBM MQ 队列
【发布时间】:2018-01-22 13:23:20
【问题描述】:

我正在尝试使用 C++ 连接到一些 IBM MQ 队列。这些队列已经定义在不同服务器的不同管理器队列下。这个想法是连接到一个 VIP,它将平衡指向每个服务器的工作负载。

我遇到的问题是我正在使用cmqc.h 库,为了连接我必须使用MQCONNMQCONNX,为此我需要队列管理器名称,这是我无法知道的在连接的那一刻,由于 F5 平衡器,我不知道将使用哪一个。

我目前用作示例的代码如下:

#include <cmqc.h>
#include <cmqxc.h> 
#include <string.h>
#include <stdio.h>
#include <sstream>
#include <stdlib.h>
int main()
{
    MQHCONN connectionHandle;
    MQHOBJ m_SourceQueue;
    MQLONG completionCode = 0;
    MQLONG reasonCode = 0;

    setenv("MQSERVER","SYSTEM.DEF.SVRCONN/TCP/<SERVER_IP_ADDRESS>(56245)",1);
    MQCONN(<QUEUE_MANAGER_NAME>, &connectionHandle, &completionCode, &reasonCode);


    if(MQCC_OK != completionCode)
    {            
        printf ("%s \n", "Error");
        printf ("%s %d \n", "Completion Code", completionCode);
        printf ("%s %d \n", "Reason Code", reasonCode);
    }
    MQDISC(&connectionHandle, &completionCode, &reasonCode);
}

当队列管理器名称不可用时,有人知道如何连接到队列吗?

【问题讨论】:

    标签: c++ ibm-mq virtualhost


    【解决方案1】:

    根据您提供的代码,您可以使用NULL,或空白,甚至是*,而不是队列管理器名称。

    例如:

    MQCONN("", &connectionHandle, &completionCode, &reasonCode);
    
    MQCONN(" ", &connectionHandle, &completionCode, &reasonCode);
    
    MQCONN("*", &connectionHandle, &completionCode, &reasonCode);
    

    以上任何一个都将连接到侦听您在MQSERVER 环境变量中指定的主机和端口的队列管理器。


    MQCONN 记录在 IBM MQ 知识中心页面 MQCONN - Connect queue manager 中。引用此页面中与队列管理器名称相关的一些内容:

    如果名称完全由空格组成,默认队列的名称 使用管理器

    MQSERVER 的情况下,默认队列管理器是侦听主机和所连接端口的队列管理器。

    该页面在 CCDT 的上下文中也有以下内容,但它对 MQSERVER 的工作方式相同:

    如果指定全空名称,则每个客户端连接通道都带有 尝试全空队列管理器名称,直到成功; 在 在这种情况下,没有检查队列的实际名称 经理

    在连接名称前加上星号意味着 应用程序不依赖于连接到特定队列 组里的经理。合适的应用是:

    • 放置消息但不获取消息的应用程序。
    • 放置请求消息然后从临时动态队列中获取回复消息的应用程序。

    不合适的应用程序是那些需要从 特定队列管理器中的特定队列;此类应用程序必须 不要在名称前加上星号。


    我建议您改用 CCDT(客户端通道定义表),因为它提供了更大的灵活性。 MQSERVER 只能提供主机、端口和通道名称。 CCDT 将允许您配置更多选项,例如 TLS、安全出口、最大消息长度等等。

    【讨论】:

    • 非常感谢。我已经尝试过您的解决方案,并且效果很好。再次非常感谢。
    • @JavierCampos 如果您发现我的回答有帮助,请查看“What should I do when someone answers my question?”。如果您觉得有帮助,请特别接受并投票。谢谢。
    • @JavierCampos 如果您感谢我花时间研究并为您编写此答案,请点击下方答案左侧的“灰色”复选标记,接受我的答案,以显示它向下箭头,它将变为绿色,表示它已被接受。
    猜你喜欢
    • 2018-07-07
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多