SpringBoot 对IBM MQ进行数据监听接收以及数据发送
一、需求介绍
后端使用Spring Boot2.0框架,要实现IBM MQ的实时数据JMS监听接收处理,并形成回执通过MQ队列发送。
二、引入依赖jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-api</artifactId>
</dependency>
<dependency>
<groupId>com.ibm.mq</groupId>
<artifactId>com.ibm.mq.allclient</artifactId>
<version>9.1.0.0</version>
</dependency>
三、监听实现
代码中分为三大块:
1、MQ通道连接,我这边是用的用户名密码连接,如果非密码的可不入参
2、MQ的队列连接并实现监听
3、MQ发送
@Configuration
public class MqTestConfig { @Autowired
private MqProperties mqProperties; /**=======================MQ 通道工厂============================**/
@Bean(name="mqQueueConnectionFactory")
public MQQueueConnectionFactory mqQueueConnectionFactory(){
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
mqQueueConnectionFactory.setHostName(mqProperties.getHostName());
try {
mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
mqQueueConnectionFactory.setCCSID(mqProperties.getCcsid());
mqQueueConnectionFactory.setChannel(mqProperties.getChannel());
mqQueueConnectionFactory.setPort(mqProperties.getPort());
mqQueueConnectionFactory.setQueueManager(mqProperties.getQueueManager());
} catch (JMSException e) {
e.printStackTrace();
}
return mqQueueConnectionFactory;
}
@Bean(name="userCredentialsConnectionFactoryAdapter")
public UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter(MQQueueConnectionFactory mqQueueConnectionFactory){
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
userCredentialsConnectionFactoryAdapter.setUsername(mqProperties.getUserName());
userCredentialsConnectionFactoryAdapter.setPassword(mqProperties.getPassword());
userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
return userCredentialsConnectionFactoryAdapter;
} /**============================MQ 消息监听接收=============================**/
//队列连接
@Bean(name="mqueue")
public MQQueue mqueue(){
MQQueue mqQueue = new MQQueue();
try {
mqQueue.setBaseQueueName(mqProperties.getBaseQueueNameRecv());
mqQueue.setBaseQueueManagerName(mqProperties.getBaseQueueManagerName());
} catch (JMSException e) {
e.printStackTrace();
}
return mqQueue;
}
//对队列进行监听
@Bean(name="simpleMessageListenerContainer")
public SimpleMessageListenerContainer simpleMessageListenerContainer(UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter,MQQueue mqueue){
SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
simpleMessageListenerContainer.setConnectionFactory(userCredentialsConnectionFactoryAdapter);
simpleMessageListenerContainer.setDestination(mqueue);
simpleMessageListenerContainer.setMessageListener(decMqRiskRecvService());
return simpleMessageListenerContainer;
}
//报文处理类
@Bean(name="decMqRiskRecvService")
public DecMqRiskRecvService decMqRiskRecvService(){
return new DecMqRiskRecvService();
} /**============================MQ 发送消息============================**/
@Bean(name="cachingConnectionFactory")
public CachingConnectionFactory cachingConnectionFactory(UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter){
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
cachingConnectionFactory.setTargetConnectionFactory(userCredentialsConnectionFactoryAdapter);
cachingConnectionFactory.setSessionCacheSize(5);
cachingConnectionFactory.setReconnectOnException(true);
return cachingConnectionFactory;
}
@Bean(name="jmsTransactionManager")
public PlatformTransactionManager jmsTransactionManager(CachingConnectionFactory cachingConnectionFactory){
JmsTransactionManager jmsTransactionManager = new JmsTransactionManager();
jmsTransactionManager.setConnectionFactory(cachingConnectionFactory);
return jmsTransactionManager;
}
@Bean(name="jmsOperations")
public JmsOperations jmsOperations(CachingConnectionFactory cachingConnectionFactory){
JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
jmsTemplate.setReceiveTimeout(mqProperties.getReceiveTimeout());
return jmsTemplate;
} }
mq配置文件
记得要添加get和set方法
@Configuration
@ConfigurationProperties(prefix=MqProperties.MQ_PREFIX)
public class MqProperties {
public static final String MQ_PREFIX = "mq";
private String hostName;
private int port;
private String channel;
private int ccsid;
private String userName;
private String password;
private String queueManager;
private String baseQueueManagerName;
private String baseQueueNameRecv;
private String baseQueueNameSend;
private long receiveTimeout; }
报文处理类及回执发送
1、实现类要实现MessageListener,重写onMessage方法,Message就是监听到的消息。
2、读取报文时为防止乱码,我这边按照格式分两种方式读取转码。
3、发送回执,之前发送发现报文多出了一些报文头信息,所以在队列信息加了
"queue:///" + mqProperties.getBaseQueueNameSend() + "?targetClient=1"
这样发送的报文会去掉报文头信息。
@Service
public class DecMqRiskRecvService implements MessageListener { @Autowired
private JmsOperations jmsOperations;
@Autowired
private MqProperties mqProperties; @Override
public void onMessage(Message message) {
String str = null;
// 1、读取报文
try {
if (message instanceof BytesMessage) {
BytesMessage bm = (BytesMessage) message;
byte[] bys = null;
bys = new byte[(int) bm.getBodyLength()];
bm.readBytes(bys);
str = new String(bys, "UTF-8");
} else {
str = ((TextMessage) message).getText();
str = new String(str.getBytes("ISO-8859-1"), "UTF-8");
}
} catch (JMSException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} // 2、处理报文 // 3、组装回执发送
String receipt = "";
try {
jmsOperations.convertAndSend("queue:///" + mqProperties.getBaseQueueNameSend() + "?targetClient=1", receipt.getBytes("UTF-8"));
} catch (JmsException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} }
SpringBoot 对IBM MQ进行数据监听接收以及数据发送的更多相关文章
- Python黑客编程基础3网络数据监听和过滤
网络数据监听和过滤 课程的实验环境如下: • 操作系统:kali Linux 2.0 • 编程工具:Wing IDE • Python版本:2.7.9 • 涉及 ...
- 谈谈数据监听observable的实现
一.概述 数据监听实现上就是当数据变化时会通知我们的监听器去更新所有的订阅处理,如: var vm = new Observer({a:{b:{x:1,y:2}}}); vm.watch('a.b.x ...
- Android 监听ContentProvider的数据改变
今天介绍一下怎么监听ContentProvider的数据改变,主要的方法是:getContext().getContentResolver().notifyChange(uri,null),这行代码是 ...
- Android_通过ContentObserver监听短信数据变化
1.简单介绍 在小米等一些机型,无法接收系统发出的短信广播. 仅仅能通过观察者ContentObserver,去监听短信数据的变化 2.SMS数据介绍 content://sms/inbox ...
- vue中的数据监听以及数据交互
现在我们来看一下vue中的数据监听事件$watch, js代码: new Vue({ el:"#div", data:{ arr:[,,] } }).$watch("ar ...
- Vue获取dom和数据监听
Vue获取dom对象 在js和jq中我们都能获取dom对象例如 // 获取id=1的div标签 <div id=d1>dom对象</div> // js语法 let ele = ...
- vue2.0 之计算属性和数据监听
计算属性computed <template> <div> <input type="text" name="" v-model= ...
- Vue之数据监听存在的问题
Vue之数据监听 当数据监听的是列表时,数据发生改变,不会被监听到. // 用$set修改数组中的数组能够被监听 // app.$set(this.hobby, 0, "爱你哦") ...
- 设置USB数据监听
设置USB数据监听 在Kali Linux中,USB也是作为一个通信端口进行存在.常见的鼠标.键盘.U盘都是通过USB接口传输数据.所以,对于USB接口也可以实施监听,类似网络接口一样.在进行US ...
随机推荐
- [Luogu] 线段树 2
https://www.luogu.org/problemnew/show/P3373 双懒标记下放 先乘后加 #include <bits/stdc++.h> using namespa ...
- NSArray 的创建和遍历
数组 用来存贮对象的有序列表,它是不可变的 不能存数C语言的基本数据类型 只支持OC对象 #pragma mark Create a array //Initialize NSArray void a ...
- 虚拟机安装WIN7教程
1.去下载win7原装镜像,推荐去官方网站下载:https://msdn.itellyou.cn/ 也可以直接使用Win7系统和激活工具链接:https://pan.baidu.com/s/1SJSE ...
- ICEM-水雷
原视频下载地址: https://yunpan.cn/cqhsvXAKUQEA4 访问密码 ef39
- adb的一些命令
adb pull <手机路径> <本机路径> 从手机中拉取信息到本地电脑上 adb push <本机路径> <手机路径> 从本地电脑推送信息到手机上
- mysql 远程登陆
1.查询mysql是否启动 netstat -lnp|grep 3306 ps -df |grep mysqld 2.通过TCPIP的方式测试连接 mysql -uqingjiao -padm ...
- 2.4 Go语言基础之切片
本文主要介绍Go语言中切片(slice)及它的基本使用. 一.引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x [3]int) ...
- error C2086: “int WINGDIAPI”: 重定义
1>------ 已启动生成: 项目: OSG_3_1_osgViewer应用基础, 配置: Debug x64 ------1>cl : 命令行 warning D9002: 忽略未知选 ...
- 苹果系统安装虚拟机 Mac如何安装虚拟机教程 (含系统镜像的下载地址)
镜像下载地址 http://www.itellyou.cn 1.前言 大家在用 Mac 系统的时候,可能有时难免还是要用到 Windows 系统.在 Mac 上使用 Windows 系统有二种方 ...
- bs4笔记
1.网页输出乱码的解决办法 r= requests.get('https://www.baidu.com/') r.encoding = 'gbk2312' #有可能 gbk.utf-8 soup ...