2015-06-30 141 views
0

有一个系统(IBM MDM)通道:SC.MDM.QM 在此通道上,您可以访问总线管理器。 例如:M99.ESB.MDM2含有queu的消息:ESB.IBSO.TB49.MDM.ORG.INJava。如何通过远程通道连接到远程Websphere MQ?

这是我们如何能够(使用RFHUtil效用)把消息发送到queu :

队列管理器名称(连接到)

SC.MDM.QM/TCP/megri-t5.cgs.sbrf.ru(1414)

队列名称

ESB.IBSO.TB49.MDM.ORG.IN

远程队列管理器名称(远程队列只)

M99.ESB.MDM2

但我时试图通过Java类设置相同的设置:

public class SetWebsphere extends ConnectSettings { 

    public static String queueName = "ESB.IBSO.TB49.MDM.ORG.IN"; 

    MQQueue defaultLocalQueue; 
    MQQueueManager qManager; 

    @SuppressWarnings({ "unchecked", "deprecation" }) 
    public void init(){ 
     //Set MQ connection credentials to MQ Envorinment. 
     MQEnvironment.hostname = hostName; 
     MQEnvironment.channel = channel; 
     MQEnvironment.port = port; 
     MQEnvironment.userID = user; 

     MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT); 

     try { 
      //initialize MQ manager. 
      qManager = new MQQueueManager(qMngrStr); 
     } catch (MQException e) { 
      e.printStackTrace(); 
     } 
    } 

    @SuppressWarnings("deprecation") 
     public void putAndGetMessage(String msg){ 
     int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_INQUIRE; 
     try { 
      defaultLocalQueue = qManager.accessQueue(queueName, openOptions); 
      System.out.println(queueName); 

      MQMessage putMessage = new MQMessage(); 

      byte[] xk = msg.getBytes("UTF-8"); 
      putMessage.write(xk); 
      putMessage.characterSet = 1208; 
      //specify the message options... 
      MQPutMessageOptions pmo = new MQPutMessageOptions(); 
      // accept 
      // put the message on the queue 
      defaultLocalQueue.put(putMessage, pmo); 

      System.out.println("Message is put on MQ."); 

      defaultLocalQueue.close(); 
      qManager.disconnect(); 
     } catch (MQException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

public class ConnectSettings { 

    static String qMngrStr; 
    static String hostName; 
    static String channel; 
    static int port; 

    public static void ConnectIFT() { 

     qMngrStr = "M99.ESB.MDM2"; 
     hostName = "megri-t5.cgs.sbrf.ru"; 
     port = 1414; 
     channel = "SC.MDM.QM"; 
    } 
} 

结果是:

com.ibm.mq.MQException: MQJE001: Completion code '2', Reason'2058'. 
    at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:238) 
    at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:505) 
    at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:547) 
    at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:95) 
    at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:182) 
    at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:869) 
    at com.ibm.mq.MQQueueManagerFactory.procure(MQQueueManagerFactory.java:761) 
    at com.ibm.mq.MQQueueManagerFactory.constructQueueManager(MQQueueManagerFactory.java:712) 
    at com.ibm.mq.MQQueueManagerFactory.createQueueManager(MQQueueManagerFactory.java:171) 
    at com.ibm.mq.MQQueueManager.<init>(MQQueueManager.java:603) 
    at ibmWebsphereMQ.SetWebsphere.init(SetWebsphere.java:67) 
    at ibsoTestWebsphereMQ.IBSOTest.IBSOCreateCLient(IBSOTest.java:44) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:702) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:894) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1219) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 
    at org.testng.TestRunner.privateRun(TestRunner.java:768) 
    at org.testng.TestRunner.run(TestRunner.java:617) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:240) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:87) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1188) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1113) 
    at org.testng.TestNG.run(TestNG.java:1025) 
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:109) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:202) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:173) 

此代码工作正常,如果我试图通过总线通道连接,例如 (其他服务器):

qMngrStr = "M99.ESB.MDM2"; 
hostName = "iskona-t2.cgs.sbrf.ru"; 
port = 1422; 
channel = "SC.M99.ESB.MDM2"; 

的主要问题:如何把消息通过排队系统通道(SC.MDM.QM),使用java代码?

在此先感谢!

回答

1

原因码2058指向队列管理器名称错误。你确定你在代码中提供了正确的队列管理器名称吗?您可能正在提供正确的频道,主机,端口和传输类型,但队列管理器名称不正确。因此请检查队列管理器是否正确。

1

当您想使用QRemote时,会涉及到两个队列管理器。有一个连接到哪个目标队列,哪个连接目标队列。在你的问题你提到:

远程队列管理器名称(远程队列只)

M99.ESB.MDM2

在此基础上我猜测M99.ESB.MDM2就是目的地队列被托管,并且您要连接的QMgr具有另一个名称。

  • 为了达到CONNECT的目的,指定QMgr,TCP套接字物理终止。
  • 指定PUT到远程队列时,可以指定远程QMgr的名称以及目标队列。
0

谢谢,但我刚刚发现通道SC.MDM.QM受SLL保护。 我在本地主机上安装了SSL证书。该证书允许使用RFHUtil和SC.MDM.QM通道放置消息。 也许我需要在我的代码中为SSL连接编写一些连接选项?

相关问题