jms java client mq_将Java客户端(JMS)连接到IBM MQ时出现问题

我正在尝试使用基本上通过以下方式构建的Java客户端使用SSL消耗IBM MQ(版本8.0.0.8):

Oracle JKD 8和IBM JRE 7(出于测试目的,我每个都有一个客户端)

com.ibm.mq.allclient-9.1.0.0.jar

javax.jms-api-2.0.1.jarspring-jms-4.3.7.RELEASE.jar

spring-jms-4.3.7.RELEASE.jar

MQ是一种请求/答复类型。

我已经设置了正确的证书和所有MQ属性,但是由于某种原因,连接“掉线了”,并且客户端没有错误,我的请求从未得到任何响应,并且一直“永远”运行,从未得到任何响应。我唯一的线索是MQ日志中的错误消息,内容为:

Process(31600.16) User(QMQM) Jobname(JOB_NAME)

Host(HOST_NAME)

VRMF(8.0.0.8) QMgr(MANAGER_NAME)

AMQ9638: SSL communications error for channel

‘CHANNEL_NAME’. EXPLANATION:

Cause . . . . . : An unexpected SSL communications error occurred

for a channel, as reported in the preceding messages. The

channel is ‘CHANNEL_NAME’;

奇怪的是发生了SSL握手,我的证书被MQ接受了,但是由于某些原因在此之后发生了某些事情。我正在尝试同时使用Oracle JRE 8和IBM

JRE7。也许是MQ方面的某些东西(IBM MQ v8.0.0.8)或我缺少的某些配置。

我已经安装了JCE无限策略,所以问题不是CipherSpec X CipherSuite。

我正在使用-Djavax.net.debug = all,可以看到我的证书被正确使用,并且在那里看不到任何问题…

我在MQ团队的联系点告诉我,由于某种原因,我的应用程序正在吊销证书(与CLR有关的事情),但是我不知道为什么会发生这种情况。

我的Java代码:

public Message callMQ() {

Message message = null;

try {

MQConnectionFactory factory = mqQueueConnectionFactory();

JMSContext context = factory.createContext();

Destination requestQueue = context.createQueue("queue:///REQUEST_QUEUE");

Destination replyQueue = context.createQueue("queue:///REPLY_QUEUE");

JmsTemplate jmsTemplate = new JmsTemplate(factory);

FIXMLRootInbound inbound = new FIXMLRootInbound();

String xml = XmlUtil.xmlObjectToString(inbound);

message = jmsTemplate.sendAndReceive(requestQueue,

session -> {

Message req = session.createTextMessage(xml);

req.setJMSCorrelationID(UUID.randomUUID().toString());

req.setJMSDestination(requestQueue);

req.setJMSReplyTo(replyQueue);

return req;

});

} catch (Throwable e) {

e.printStackTrace();

}

return message;

}

private MQConnectionFactory mqQueueConnectionFactory() throws NoSuchAlgorithmException, KeyStoreException,

IOException, CertificateException, UnrecoverableKeyException, KeyManagementException, JmsException {

SSLSocketFactory sslSocketFactory = sslContext().getSocketFactory();

MQEnvironment.sslSocketFactory = sslSocketFactory;

MQEnvironment.sslCipherSuite = "TLS_RSA_WITH_AES_256_CBC_SHA";

MQEnvironment.sslFipsRequired = false;

MQConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();

mqQueueConnectionFactory.setHostName(host);

try {

mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

mqQueueConnectionFactory.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE,

WMQConstants.WMQ_CM_CLIENT);

mqQueueConnectionFactory.setQueueManager(queueManager);

mqQueueConnectionFactory.setSSLCipherSuite("TLS_RSA_WITH_AES_256_CBC_SHA");

mqQueueConnectionFactory.setCCSID(285);

mqQueueConnectionFactory.setChannel(channel);

mqQueueConnectionFactory.setPort(port);

mqQueueConnectionFactory.setSSLSocketFactory(sslSocketFactory);

mqQueueConnectionFactory.setSSLFipsRequired(false);

} catch (Exception e) {

log.error("Error creating MQQueueConnectionFactory.", e);

}

return mqQueueConnectionFactory;

}

private SSLContext sslContext() throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {

try (InputStream cert = new FileInputStream("C:\\myplace\\Dev\\Certificates\\MY_KEYSTORE.jks")) {

final KeyStore caCertsKeyStore = KeyStore.getInstance("JKS");

caCertsKeyStore.load(cert, "changeit".toCharArray());

final KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

final TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");

PKIXRevocationChecker rc = (PKIXRevocationChecker)cpb.getRevocationChecker();

rc.setOptions(EnumSet.of(

PKIXRevocationChecker.Option.PREFER_CRLS,

PKIXRevocationChecker.Option.ONLY_END_ENTITY,

PKIXRevocationChecker.Option.SOFT_FAIL,

PKIXRevocationChecker.Option.NO_FALLBACK));

PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(caCertsKeyStore, new X509CertSelector());

pkixParams.addCertPathChecker(rc);

kmf.init(caCertsKeyStore, "changeit".toCharArray());

tmf.init( new CertPathTrustManagerParameters(pkixParams) );

final SSLContext sslContext = SSLContext.getInstance("TLS");

sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());

return sslContext;

} catch (Exception e) {

throw new RuntimeException("Exception creating SSLContext", e);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQuery-Dialog(弹出窗口,遮蔽窗口)

在Ajax中经常用到的弹出窗口和遮蔽窗口。自己写肯定是一个最佳方案,但时间和成本上,还是决定了寻找现成的吧。大概罗列一下。需要我满足我几个条件 一定要简洁方便拥有遮蔽功能,Model Dialog ,所谓的模态窗口可以根据HTML弹出窗口…

java 设置系统参数_Java如何设置系统参数和运行参数

系统参数系统级全局变量,该参数在程序中任何位置都可以访问到。优先级最高,覆盖程序中同名配置。系统参数的标准格式为:-Dargnameargvalue,多个参数之间用空格隔开,如果参数值中间有空格,则用引号括起来。其…

HDU 1244 DP

题目大意: 我们需要将一串数字分成多个确定个数的连续段,在得到所有段的和的最大值 定义一个dp[i][j]数组表示在前j个数中取满 i 个段所能得到的最大值 那么也就是说明在这道题目当中每一段都是必须要被取到的 能够取到的前提是 j > cnt[i] //表示前 i 段的数字个…

java怎么生成字母_java自动生成字母

新建一个类SpringContextUtil.java:import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/*** 获取spring容器,以访问容器中定义的其…

一天一块钱第二天翻倍_再把钱翻倍

一天一块钱第二天翻倍总览 很久以前,我写了一篇关于用双倍赚钱的文章。 但是,当解决方案相当简单时,仍然是许多开发人员普遍担心的问题。 用双倍赚钱的问题 double有两种类型的错误。 它存在表示错误。 即它不能精确地表示所有可能的十进制…

移动端回到顶部

PC端回到顶部,很多人都是用js来写的。这样效果比较好一些了,但是在移动端的时候,就没必要搞个animate的动画了,然后实现回到顶部的方法也有:window.scrollTo(0,0)。但是更简单的就是a锚点里面href"#"&#x…

java调用接口实现的方法_java调用接口的实现方法

java调用接口的实现方法发布时间:2020-06-29 11:08:46来源:亿速云阅读:78作者:Leah本篇文章给大家分享的是有关java调用接口的实现方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇…

Java EE应用程序的单片到微服务重构

您是否曾经想过将现有的Java EE整体应用程序重构为基于微服务的应用程序需要做什么? 该博客解释了一个简单的购物车示例如何转换为基于微服务的应用程序,以及围绕它的一些担忧。 整体和基于微服务的应用程序的完整代码库位于: github.com/ar…

Java代码韦伯分布_第十五节、韦伯局部描述符(WLD,附源码)

纹理作为一种重要的视觉线索,是图像中普遍存在而又难以描述的特征,图像的纹理特征一般是指图像上地物重复排列造成的灰度值有规则的分布。纹理特征的关键在于纹理特征的提取方法。目前,用于纹理特征提取的方法有很多,最具有代表性…

windows和linux删除文件方法

Windows下bat文件内容如下;复制代码 代码如下: echo offforfiles -p "D:\servers\apache2.2\logs" -s -m *.log -d -15 -c "cmd /c del path"forfiles -p "D:\servers\mysql\logs" -s -m *.log -d -15 -c "cmd /c del path"…

JavaFX真实世界应用程序:欧洲电视网广播联盟

我荣幸地与今年在德累斯顿Saxonia 系统公司工作的Alexander Casall一起在JavaOne上展示了多个JavaFX Real-World应用程序。 在准备本次演讲时,我们向客户和合作伙伴发送了一份调查表,并向他们询问了一些与他们的项目,他们的应用程序以及他们对…

java 三大集合_java中的三大集合入门笔记(简单实用)

为什么使用集合框架如图:集合的好处:集合弥补了数组的缺陷,它比数组更灵活更实用,可大大提高软件的开发效率,而且不同的集合适用于不同的场合。Java集合主要分为以下3种类型Java集合框架提供了一套性能优良、使用方便的…

java POI 写入百万数据到 excel

.xls文件只支持6w的数据写入 .xlsx文件只支持104w数据的写入 在java中jxl工具类只能操作.xls的文件,不能操作.xlsx的文件 POI工具类能够支持.xlsx的文件操作。 excel的数据读写都相应的简单,网上也有很多的代码,我这里要说的是怎么样写入100w…

摆脱困境:将运行时配置作为JSON返回

如果需要确定部署到远程服务器的Spring Web应用程序的运行时配置,则需要读取从远程服务器找到的属性文件。 这很麻烦。 幸运的是,有更好的方法。 这篇博客文章描述了我们如何 启动我们的Web应用程序时,将运行时配置写入日志文件。 返回运行…

网络爬虫依赖的架包

网络爬虫依赖的架包 commons-codec-1.3.jarcommons-httpclient-3.1.jarcommons-logging-1.0.4.jarhtmllexer.jarhtmlparser.jar 转载于:https://www.cnblogs.com/aicpcode/p/4194898.html

调用布尔变量java_关于java的参数的调用,还有布尔的理解,这有一段代码,我有些不太理解,希望能够帮我分析下,谢谢...

第一段代码public class CustomerBiz {String[] namesnew String[30]; //创建学生姓名数组//实现姓名的添加public void addName(String name){for(int i0;iif(names[i]null){names[i]name;break;}}}public void showName(){ //显示姓名for(int i0;iif(names[i]!null){System.o…

优化哈希策略的简介

总览 用于哈希键的策略可以直接影响哈希集合(例如HashMap或HashSet)的性能。 内置的哈希函数被设计为通用的,并且可以在各种用例中很好地工作。 我们可以做得更好,特别是如果您对用例有一个很好的了解吗? 测试哈希策…

java中报错convension_LambdaConversionException与泛型:JVM错误?

此错误不是完全固定的。我只是LambdaConversionException在1.8.0_72中遇到了一个问题,发现Oracle的错误跟踪系统中有未解决的错误报告: link1,link2。(编辑:据报告,链接的错误已在JDK 9 b93中关闭)作为一种简单的解决方…

java初学者指南_Java初学者指南

java初学者指南Java编程的第一步。 对于Java中的入门教程,请参阅Sun的官方帮助这里 除了核心语言外,还有几种技术和API 介绍。 我们建议首先阅读涵盖 基础知识,并继续其余的教程。 我们建议: 保持代码简单明了且易于阅读 拆…

Java面试题2019简书_2019最新Spring面试题大全含答案之Spring Beans(2019最全Spring超级葵花宝典)...

1.什么是Spring beans?Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。Spring 框架定义的beans都是单件bean…