使用java连接到ibm mq 7.5时出现的问题

使用java连接到ibm mq 7.5时出现的问题,java,ibm-mq,Java,Ibm Mq,我对ibm mq非常陌生,我发现与mb相关的文档或书籍非常少,我找到的唯一一本是2004年编写的“WebSphere mq使用Java”。但现实世界已经改变了很多。 根据以下说明,我在redhat linux 64位上成功安装并验证了mq server 7.5 我还创建了队列管理器myqm1、队列LQ.TEST、通道JAVA.channel,并通过服务器上的命令行进行了一些测试,以确保它们正常工作。但是,当我在windows xp上安装mq客户端并编写以下java代码时,它总是抛出异常:com.

我对ibm mq非常陌生,我发现与mb相关的文档或书籍非常少,我找到的唯一一本是2004年编写的“WebSphere mq使用Java”。但现实世界已经改变了很多。 根据以下说明,我在redhat linux 64位上成功安装并验证了mq server 7.5

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

我的代码:

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

/***简单示例程序*/公共类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;
} }

有人能告诉我这一点吗?我完全崩溃了。

在MQ v7.5中,默认情况下,对队列管理器的访问被阻止。您需要为您创建的通道创建通道身份验证记录,
JAVA.channel
,以允许用户访问队列管理器。请按照此操作了解有关通道身份验证记录的更多详细信息o扩展Shashi的回答,因为WMQ V7.1默认的CHLAUTH规则阻止所有SVRCONN通道上的所有访问,并且它们阻止所有SVRCONN通道上的管理访问。如果您确实希望以
mqm
的形式连接到
JAVA.CHANNEL
,那么您需要覆盖这两种行为

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

建议的方法是使用非管理性的ID。例如,如果您使用名为
mquser
的私有组(也称为
mquser
)创建了一个名为
mquser
的ID,则您可以授予该ID连接和查询QMgr的权限,以及打开指定队列以进行put、get、浏览和查询的权限相反,在未经身份验证的通道上使用会相对安全。您可以更改代码,将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 A启用事件UTHOREV(已启用)
。这将导致QMgr向
SYSTEM.ADMIN.QMgr.event
队列发出事件消息。您可以使用或解析事件消息。对于任何给定的授权事件,消息会告诉您请求访问的ID、API调用(连接、打开、关闭等),调用所针对的对象以及使用的确切选项


在WMQ V7.1之前,WebSphere MQ允许所有远程连接,甚至是匿名的管理连接。虽然这允许您轻松连接,但在今天更为恶劣的网络环境中,在QMgr的主机服务器上远程匿名执行代码的能力被视为不可接受的安全风险。因此,现在新的QMgr被设置为不可接受默认情况下允许任何远程管理访问。作为管理员,这要求您显式禁用安全性以获取旧行为或显式设置安全访问。

可能相关:看起来您的用户名和密码可能错误,因为2035未经授权。您是否向谷歌询问
com.ibm.mq.MQExcep选项:MQJE001:完成代码“2”,原因“2035”?@beny23仅供参考…WMQ不会验证密码,除非存在通道安全出口。@user1458290 WMQ服务器和客户端的下载内容包含可在本地安装的文档。您还可以访问web上最新的信息中心。如果您需要访问WMQ客户机或服务器的其他版本您也可以转到所有版本(返回V5.0或更高版本)的文档链接。感谢T。Rob,您的方法对用户mqm有效,而不是对新创建的用户mquser及其私有组有效,这是我尝试的结果。无论我如何为mquser设置身份验证记录,它只会抛出与我的线程所说的错误相同。是否需要授予mquser user/group一些特权来访问mq文件和服务?我在回复中添加了一些附加的诊断建议。mquser ID和group不需要访问WMQ文件。当使用通道访问QMgr时,所有访问QMgr的进程都是WMQ进程。当programs使用共享内存连接访问QMgr,目录权限使用setuid允许程序在需要时写入错误。您收到的任何2035都可能是因为该组未被授予其所需的权限,或者正在访问您认为是的对象以外的对象。例如,如果使用IBM Java类,应用程序将总是询问任何对象。你好,沙希,我看了一遍文档,测试结果是对T.Rob答案的评论,请看一下。