【问题标题】:Issues with connecting to ibm mq 7.5 using java使用 java 连接到 ibm mq 7.5 的问题
【发布时间】:2012-08-19 22:58:25
【问题描述】:

刚接触ibm mq,发现mb相关的文档或书籍很少,唯一找到的就是2004年写的《WebSphere MQ Using Java》。但是现实世界已经发生了很大的变化. 我根据this成功在redhat linux 64位上安装并验证了mq server 7.5

我还创建了队列管理器myqm1、队列LQ.TEST、通道JAVA.CHANNEL,并通过服务器上的命令行进行了一些测试,以确保它们正常工作。但是,当我在 windows xp 上安装 mq 客户端并在下面编写 java 代码时,它总是抛出 exception:com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2035'

我的代码:

导入 com.ibm.mq.*;导入 com.ibm.mq.constants.MQConstants;

/** * 简单示例程序 */ public class MQSample {

// code identifier
static final String sccsid = "@(#) MQMBID sn=p000-L120604 su=_H-IvIK4nEeGko6IWl3MDhA pn=MQJavaSamples/wmqjava/MQSample.java";

// define the name of the QueueManager
private static final String qManager = "myqm1";
// and define the name of the Queue
private static final String qName = "LQ.TEST";

/**
 * Main entry point
 *
 * @param args - command line arguments (ignored)
 */
public static void main(String args[]) {
    try {
        MQEnvironment.hostname = "58.2.221.196"; 
        MQEnvironment.channel = "JAVA.CHANNEL"; 
        MQEnvironment.port = 1414;
        MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);
        MQEnvironment.userID = "mqm"; 
        MQEnvironment.password = "mqm";
        MQEnvironment.CCSID = 1208;

        // Create a connection to the QueueManager
        System.out.println("Connecting to queue manager: " + qManager);
        MQQueueManager qMgr = new MQQueueManager(qManager);

        // Set up the options on the queue we wish to open
        int openOptions = MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_OUTPUT;

        // Now specify the queue that we wish to open and the open options
        System.out.println("Accessing queue: " + qName);
        MQQueue queue = qMgr.accessQueue(qName, openOptions);

        // Define a simple WebSphere MQ Message ...
        MQMessage msg = new MQMessage();
        // ... and write some text in UTF8 format
        msg.writeUTF("Hello, World!");

        // Specify the default put message options
        MQPutMessageOptions pmo = new MQPutMessageOptions();

        // Put the message to the queue
        System.out.println("Sending a message...");
        queue.put(msg, pmo);

        // Now get the message back again. First define a WebSphere MQ
        // message
        // to receive the data
        MQMessage rcvMessage = new MQMessage();

        // Specify default get message options
        MQGetMessageOptions gmo = new MQGetMessageOptions();

        // Get the message off the queue.
        System.out.println("...and getting the message back again");
        queue.get(rcvMessage, gmo);

        // And display the message text...
        String msgText = rcvMessage.readUTF();
        System.out.println("The message is: " + msgText);

        // Close the queue
        System.out.println("Closing the queue");
        queue.close();

        // Disconnect from the QueueManager
        System.out.println("Disconnecting from the Queue Manager");
        qMgr.disconnect();
        System.out.println("Done!");
    } catch (MQException ex) {
        ex.printStackTrace();
        System.out.println("A WebSphere MQ Error occured : Completion Code " + ex.completionCode
                + " Reason Code " + ex.reasonCode);


    } catch (java.io.IOException ex) {
        System.out.println("An IOException occured whilst writing to the message buffer: " + ex);
    }
    return;
} }

有人可以告诉我吗?我完全崩溃了。

【问题讨论】:

  • 您的用户名和密码可能有误,因为 2035 是 NOT AUTHORIZED
  • 你有没有向谷歌询问com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2035'
  • @beny23 仅供参考...WMQ 不会验证密码,除非存在通道安全出口。
  • @user1458290 WMQ 服务器和客户端的下载包含可以在本地安装的文档。您还可以访问网络上最新的信息中心here。如果您需要访问其他版本的 WMQ 客户端或服务器的手册,您也可以访问 this page,其中链接到所有版本的文档,这些版本可以追溯到 V5.0 或更高版本。

标签: java ibm-mq


【解决方案1】:

为了扩展 Shashi 的答案,从 WMQ V7.1 开始,默认的 CHLAUTH 规则会阻止所有 SVRCONN 通道上的所有访问并且它们会阻止所有 SVRCONN 通道上的管理访问。如果你真的想以mqm 的身份连接到JAVA.CHANNEL,那么你需要覆盖both这两种行为。

如果您确实愿意允许使用管理用户 ID 与 QMgr 进行未经身份验证的远程连接,那么您可以选择完全禁用 CHLAUTH 规则。您可以通过在runmqsc 中发出ALTER QMGR CHLAUTH(DISABLED) 命令来执行此操作,但是非常不鼓励这样做,因为它使QMgr 可以使用WMQ 管理用户ID 进行匿名远程代码执行。然而,这似乎是你想要做的。

推荐的方法是使用一个管理的 ID。例如,如果您使用一个名为mquser 的私有组创建了一个名为mquser 的ID,那么您可以授予它在QMgr 上连接和查询的权限,并打开指定队列进行放置、获取、浏览和查询。由于 ID 不是管理 ID,因此在未经身份验证的频道上使用相对安全。您可以更改代码以将 ID 指定为 mquser 而不是 mqm,然后使用 CHLAUTH 规则来允许连接。例如:

SET CHLAUTH('JAVA.CHANNEL') TYPE(USERMAP) +
    CLNTUSER('mquser') USERSRC(MAP) +
    MCAUSER('mquser') ACTION(ADD) 

上述规则告诉 QMgr “当您在 JAVA.CHANNEL 上看到来自 mquser ID 的连接时,将 MCAUSER 设置为 mquser 并允许连接。”

当您授予权限时,请记住授予组而不是用户。例如,如果使用setmqaut,则使用-g 选项而不是-p 选项。如果授权错误有任何问题,您可以使用事件消息轻松解决这些问题。首先,使用ALTER QMGR AUTHOREV(ENABLED) 启用事件。这将导致 QMgr 将事件消息发送到 SYSTEM.ADMIN.QMGR.EVENT 队列。您可以使用SupportPac MH05SupportPac MS0P 来解析事件消息。对于任何给定的授权事件,消息都会告诉您请求访问的 ID、API 调用(连接、打开、关闭等)、调用对象以及使用的确切选项。

在 WMQ V7.1 之前,WebSphere MQ 允许所有远程连接,甚至是匿名的管理连接。尽管这使您可以轻松连接,但在当今更加恶劣的网络环境中,在 QMgr 的主机服务器上远程匿名执行代码的能力被视为不可接受的安全风险。所以现在一个新的 QMgr 默认设置为不允许 any 远程管理访问。作为管理员,这要求您明确禁用安全性以获取旧行为或明确提供安全访问。

【讨论】:

  • 谢谢T.Rob,你的方法对用户mqm有效,对新创建的用户mquser及其私有组无效,这是我尝试的结果。不管我如何设置mquser的认证记录,它只是抛出与我的线程所说的相同的错误。是否需要授予 mquser 用户/组访问 mq 文件和服务的权限?
  • 我在回复中添加了一些额外的诊断建议。 mquser ID 和组不需要访问 WMQ 文件。当使用通道访问 QMgr 时,所有访问 QMgr 的进程都是 WMQ 进程。当程序使用共享内存连接访问 QMgr 时,目录权限使用 setuid 以允许程序在需要时写入错误。您收到的任何 2035 要么是因为该组没有被授予它需要的权限,要么正在访问您认为的对象以外的对象。例如,如果使用 IBM Java 类,应用程序将始终查询任何对象。
【解决方案2】:

在 MQ v7.5 中,默认情况下会阻止对队列管理器的访问。您需要为您创建的通道创建通道身份验证记录,JAVA.CHANNEL 以允许用户访问队列管理器。请关注此link 了解有关通道认证记录的更多详细信息

【讨论】:

  • 你好,Shashi,我阅读了文档,测试结果与 T.Rob 回答的评论一样,请看一下。
猜你喜欢
  • 2019-07-16
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2015-01-24
  • 2019-03-17
  • 2019-06-16
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多