【问题标题】:Unable to connect to Websphere MQ Manager using XMS无法使用 XMS 连接到 Websphere MQ 管理器
【发布时间】:2015-06-29 14:58:32
【问题描述】:

这段代码重现了这个问题:

#include <iostream>
#include <xms.hpp>

int main()
{
    try
    {
        xms::ConnectionFactory factory;

        factory.setIntProperty(XMSC_CONNECTION_TYPE,      XMSC_CT_WMQ);
        factory.setIntProperty(XMSC_WMQ_CONNECTION_MODE,  XMSC_WMQ_CM_CLIENT);
        factory.setStringProperty(XMSC_WMQ_QUEUE_MANAGER, "my.queue.manager");
        factory.setStringProperty(XMSC_WMQ_HOST_NAME,     "my.dev.mq");
        factory.setStringProperty(XMSC_WMQ_CHANNEL,       "my.channel");
        factory.setIntProperty(XMSC_WMQ_PORT,              1414);

         std::cout << "Is Factory Null? => " << factory.isNull() << std::endl;
         xms::Connection conn = factory.createConnection(); //THIS THROWS EXCEPTION
         std::cout << "Is Factory Null? => " << factory.isNull() << std::endl;
    }
    catch(xms::Exception const & e)
    {
         e.dump(std::cout);
    }
}

它抛出异常,转储以下消息:

Is Factory Null? => 0
Exception:
ErrorData =
ErrorCode = 26 (XMS_E_CONNECT_FAILED)
JMS Type  = 1 (XMS_X_GENERAL_EXCEPTION)
Linked Exception:
ErrorData = libmqic_r.so
ErrorCode = 0 (XMS_E_NONE)
JMS Type  = 1 (XMS_X_GENERAL_EXCEPTION)

知道代码有什么问题吗?

请注意,devpmmq 只是实际 IP 地址(主机)的别名。如果我为其设置 any 随机/无意义值,我会得到相同的错误,这很糟糕,因为 API 应该给出更好的错误消息,例如 "host not found" 或者单单那一行。有没有办法启用更多详细诊断?

【问题讨论】:

    标签: c++ ibm-mq xms


    【解决方案1】:

    XMS C/C++ 在内部加载 WebSphere MQ 客户端库。这里的问题是 XMS 无法找到 WebSphere MQ 客户端库libmqm_r.so

    令我不解的是代码已将XMSC_WMQ_CONNECTION_MODE 设置为XMSC_WMQ_CM_CLIENT,但XMS 正在尝试加载libmqm_r.so。它应该尝试加载libmqic_r.so

    您是否安装了 WebSphere MQ 客户端?另外XMSClients是什么版本可以到here下载。

    【讨论】:

    • 非常感谢。现在它可以工作了(我必须将 LD_LIBRARY_PATH 设置为指向包含libmqic_r.so 的目录)。你是对的,它应该是libmqic_r.so。这是一个错字(我正在尝试不同的值,在这个过程中我发布了不匹配的错误)。
    • 您能否向我提供一个在线文档的链接,其中解释了哪个*.so 用于什么目的。我的意思是,我怎么知道我是否需要libmqm.solibmqm_r.so 或任何其他.so。它们之间有什么区别?等等。
    • 我使用 XMS 编写了一个分布式应用程序。当我使用 valgrind 运行它时,它会报告 Invalid free()/delete/delete[]。所以我写了一个小程序来重现这个错误,我发现当这个小程序链接到libmqic_r.so时,它才报告Invalid free()/delete/delete[]。我的小程序不使用任何东西或从 XMS 调用任何函数。只需链接libmqic_r.so 就足以产生错误。您能否给我一些指示/猜测可能出了什么问题?
    • ... valgrind 报告的堆栈跟踪包含这两个有趣的函数:来自libcexit 和来自vg_preloaded.so_vgnU_freeres。似乎当程序退出并且库卸载时,它试图释放一些内存,出现这个Invalid free... 错误。
    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多