我对 ibm mq 很陌生,我发现与 mb 相关的文档或书籍很少,我找到的唯一一本是 2004 年写的“WebSphere MQ Using Java”。但现实世界已经发生了很大变化。我根据this在redhat linux 64位上成功安装并验证了mq server 7.5
我还创建了 queue manager myqm1、 queue LQ.TEST、 channelJAVA.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 {
Run Code Online (Sandbox Code Playgroud)// 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 通道上的管理访问。如果您真的想连接到JAVA.CHANNELasmqm那么您将需要覆盖这两种行为。
如果您确实愿意允许使用管理用户 ID 与 QMgr 进行未经身份验证的远程连接,那么您可以选择完全禁用 CHLAUTH 规则。您可以通过发出ALTER QMGR CHLAUTH(DISABLED)命令来做到这一点,runmqsc但是非常不鼓励这样做,因为它使 QMgr 对使用 WMQ 管理用户 ID 的匿名远程代码执行开放。然而,这似乎是你想要做的。
推荐的方法是使用非管理性ID 。例如,如果您创建了一个被呼叫mquser的私有组的 ID ,mquser那么您可以授予它连接和查询 QMgr 的权限,以及打开指定队列进行放置、获取、浏览和查询的权限。由于 ID 不是管理性的,因此在未经身份验证的频道上使用会相对安全。您可以更改代码以指定 ID asmquser而不是,mqm然后使用 CHLAUTH 规则来允许连接。例如:
SET CHLAUTH('JAVA.CHANNEL') TYPE(USERMAP) +
CLNTUSER('mquser') USERSRC(MAP) +
MCAUSER('mquser') ACTION(ADD)
Run Code Online (Sandbox Code Playgroud)
上面的规则告诉 QMgr“当您看到来自mquserID 上的连接时JAVA.CHANNEL,请将 MCAUSER 设置为mquser并允许连接。”
授予权限时,请记住将权限授予组而不是用户。例如,如果使用setmqaut使用-g选项而不是-p选项。如果授权错误有任何问题,您可以使用事件消息轻松解决这些问题。首先,使用ALTER QMGR AUTHOREV(ENABLED). 这将导致 QMgr 将事件消息发送到SYSTEM.ADMIN.QMGR.EVENT队列中。您可以使用SupportPac MH05或SupportPac MS0P来解析事件消息。对于任何给定的授权事件,该消息会告诉您请求访问的 ID、API 调用(连接、打开、关闭等)、调用所针对的对象以及所使用的确切选项。
在 WMQ V7.1 之前,WebSphere MQ 允许所有远程连接,甚至是匿名的管理连接。尽管这让您可以轻松连接,但在当今更加恶劣的网络环境中,在 QMgr 的主机服务器上远程匿名执行代码的能力被视为不可接受的安全风险。所以现在新的 QMgr 设置为默认不允许任何远程管理访问。作为管理员,这要求您明确禁用安全性以获取旧行为或明确提供安全访问。
| 归档时间: |
|
| 查看次数: |
24874 次 |
| 最近记录: |