与IBM MQ V8 jars的JAVA MQ SSL \ TLS连接无法正常工作

时间:2016-03-09 09:39:57

标签: java ssl jms ibm-mq

MQQueueConnectionFactory cf = new MQQueueConnectionFactory();

  // Config
  cf.setHostName("XXXXXXX");
  cf.setPort(1414);
  cf.setTransportType(1);
  cf.setQueueManager("XXXXXXXX");
  cf.setChannel("XXXXXXXX");
  cf.setSSLCipherSuite("TLS_RSA_WITH_AES_128_CBC_SHA");

// SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
// cf.setSSLSocketFactory(factory);

  MQQueueConnection connection = (MQQueueConnection) cf.createQueueConnection();
  MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  MQQueue queue = (MQQueue) session.createQueue("queue:///QUEUE.NAME");
  MQQueueSender sender =  (MQQueueSender) session.createSender(queue);
  MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue);      

  long uniqueNumber = System.currentTimeMillis() % 1000;
  JMSTextMessage message = (JMSTextMessage) session.createTextMessage("SimplePTP "+ uniqueNumber);     
  message.setJMSExpiration(15l);
  // Start the connection
  connection.start();

  sender.send(message);
  System.out.println("Sent message:\\n" + message);

  JMSMessage receivedMessage = (JMSMessage) receiver.receive(10000);
  System.out.println("\\nReceived message:\\n" + receivedMessage);

以上代码不起作用,我得到以下错误 com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2059' ('MQRC_Q_MGR_NOT_AVAILABLE')

为了澄清,我在VM参数中给出了正确的密钥库,信任库。但不知何故,密钥库在SSL握手时不会被接收。

但如果我在代码中添加以下两行......

  SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
  cf.setSSLSocketFactory(factory);

......它有效!!!!看起来不知何故版本8 jar无法创建默认的SSLSocketFactory。

有什么想法吗?版本7.5罐子没有这两行。

1 个答案:

答案 0 :(得分:0)

这听起来像配置问题,可能是由于错误的CLASSPATH,但可能是其他配置问题。

最快的方法是验证您的设置是否符合 IBM MQ classes for Java 的安装和配置中所述的IBM规范,特别是部分Environment variables relevant to IBM MQ classes for Java 的。检查CLASSPATH指定的目录中是否没有旧库。

另外,请查看setjmsenv目录中的java/bin脚本。这些是在运行JMS程序之前获取的。即使您使用的是MQ Java类,也可以在运行脚本中使用它们,或者查看它们以了解它们的作用以及类所依赖的设置。

我假设您没有进行此级别的验证,因为原始问题没有提及已执行任何标准故障排除。它提到的是之前使用过不同版本的jar文件,如果所做的只是将新的jar交换到旧的配置中,那么奇怪的行为就是预期的结果。如果您已经执行了一些问题排查并验证了您的设置,请使用相关详细信息更新您的问题。

如果CLASSPATH和其他配置元素经过完整性检查且仍然存在,请查看是否与 Verifying your IBM MQ classes for Java installation with the sample application 中所述的IVT程序一起发生。由于IVT程序是已知的良好代码,因此其行为将有助于确定问题是在MQ中还是在您的设置中的某些内容。