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

时间:2012-08-24 11:17:18

标签: java ibm-mq

我对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'

我的代码:

  

import com.ibm.mq. *; import 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;
} }

有人可以对我说光吗?我完全失望了。

2 个答案:

答案 0 :(得分:4)

为了扩展Shashi的答案,自WMQ V7.1起,默认的CHLAUTH规则阻止所有SVRCONN通道上的所有访问,它们阻止所有SVRCONN通道上的管理访问。如果您确实想要JAVA.CHANNEL作为mqm连接,那么您需要覆盖这些行为的两个

如果您实际上愿意允许使用管理用户标识与QMgr进行远程,未经身份验证的连接,那么您可以选择完全禁用CHLAUTH规则。您可以通过在ALTER QMGR CHLAUTH(DISABLED)中发出runmqsc命令来执行此操作,但是强烈建议不要这样做,因为它使用WMQ管理用户ID使QMgr对匿名远程代码执行保持开放状态。但是,这似乎是你想要做的事情。

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

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

以上规则告诉QMgr“当您从mquser上的JAVA.CHANNEL 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设置为默认情况下不允许任何远程管理访问。作为管理员,这要求您明确禁用安全性以获取旧行为或明确设置安全访问。

答案 1 :(得分:3)

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