繁体   English   中英

使用Java连接到IBM MQ 7.5的问题

[英]Issues with connecting to ibm mq 7.5 using java

我是ibm mq的新手,我发现与mb相关的文档或书籍很少,我发现的唯一一部是2004年写的“ WebSphere MQ Using Java”。但是现实世界发生了很大变化。 我安装在RedHat Linux 64位验证MQ服务器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;

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

有人可以给我开个灯吗? 我很沮丧

为了扩展Shashi的答案,自WMQ V7.1起,默认的CHLAUTH规则会阻止所有SVRCONN通道上的所有访问, 并且会阻止所有SVRCONN通道上的管理访问。 如果您确实想以mqm连接到JAVA.CHANNEL ,则将需要覆盖这两种行为。

如果您实际上愿意允许使用管理用户ID到QMgr进行未经身份验证的远程连接,则可以选择完全禁用CHLAUTH规则。 您可以通过在runmqsc发出ALTER QMGR CHLAUTH(DISABLED)命令来执行此操作,但是不建议这样做,因为它使QMgr可以使用WMQ管理用户ID匿名执行远程代码。 但是,这就是您似乎想做的。

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

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

上面的规则告诉QMGR“当你看到从一个连接mquser上ID JAVA.CHANNEL ,然后设置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设置为默认情况下不允许任何远程管理访问。 作为管理员,这要求您显式禁用安全性以获取旧行为或显式设置安全访问。

在MQ v7.5中,默认情况下禁止访问队列管理器。 您需要为创建的通道JAVA.CHANNEL创建通道身份验证记录,以允许用户访问队列管理器。 请点击此链接以获取有关频道身份验证记录的更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM