一、需求介绍

后端使用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();
}
} }

最新文章

  1. 【原】EasyUI ComboGrid 集成分页、按键示例
  2. gedit 乱码问题
  3. MicroERP更新记录2.2:增加B/S查询功能
  4. VS2008 工程只生成dll不生成lib的解决方案
  5. Windows 8 IIS配置PHP运行环境
  6. Spring学习笔记之Bean的一些属性设置
  7. [iOS 多线程 &amp; 网络 - 2.5] - 小文件上传
  8. linux 安装mongodb
  9. petshop4.0 具体解释之中的一个(系统架构设计)
  10. Axure快捷键大全
  11. RESTful最佳实践之基于 jersey 的增删改查
  12. 在spring拦截器中response输出html标签到页面
  13. Java IO学习笔记四
  14. ActiveMQ 入门Nodejs版
  15. Activex控件的IObjectSafety接口问题
  16. Linux常用包的安装
  17. vue2.0的contextmenu右键菜单
  18. leetcode 最后一个单词的长度
  19. 微信小程序-视频教程-百度云-下载
  20. 在java代码中用xslt处理xml文件

热门文章

  1. [POI2008]BLO-Blockade 割点
  2. Git出现 fatal: Pathspec &#39;xxx&#39; is in submodule &#39;xxx&#39; 异常的解决方案
  3. c语言 宏
  4. Singleton模式(单例模式) 饿汉式和懒汉式
  5. JS的十大排序算法
  6. Docker容器数据券
  7. Jmeter Web 性能测试入门 (四):一个小实例带你学会 Jmeter 脚本编写
  8. 【SpringBoot】SpringBoot/MyBatis/MySql/thymeleaf/Log4j整合工程
  9. 19 Flutter仿京东商城项目 商品详情 底部浮动导航布局 商品页面布局
  10. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_11-webpack研究-npm和cnpm安装配置