SpringBoot 集成 IBMMQ,实现两个服务间的消息通信。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-activemqartifactId>
dependency>
<dependency>
<groupId>javax.jmsgroupId>
<artifactId>javax.jms-apiartifactId>
<version>2.0.1version>
dependency>
<dependency>
<groupId>com.ibm.mqgroupId>
<artifactId>com.ibm.mq.allclientartifactId>
<version>9.1.1.0version>
dependency>
project:
mq:
host: 192.168.1.180 # 服务地址
port: 1416 # 服务端口
queue-manager: queueManager # 队列管理器
username: username # 用户名
password: password # 密码
channel: channel # 连接通道
receive-timeout: 2000 # 连接超时
@Data
@Configuration
@ConfigurationProperties(prefix = "project.mq")
public class JmsConfig {
/**
* 服务地址
*/
private String host;
/**
* 服务端口
*/
private Integer port;
/**
* 队列管理器
*/
private String queueManager;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 连接通道
*/
private String channel;
/**
* 连接超时
*/
private long receiveTimeout;
}
@Bean
public MQQueueConnectionFactory mqQueueConnectionFactory() {
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
mqQueueConnectionFactory.setHostName(host);
try {
mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
mqQueueConnectionFactory.setCCSID(1208);
mqQueueConnectionFactory.setChannel(channel);
mqQueueConnectionFactory.setPort(port);
mqQueueConnectionFactory.setQueueManager(queueManager);
} catch (Exception e) {
e.printStackTrace();
}
return mqQueueConnectionFactory;
}
CCSID要与连接到的队列管理器一致,Windows下默认为1381,Linux下默认为1208。1208表示UTF-8字符集,建议把队列管理器的CCSID改为1208。
@Bean
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter(MQQueueConnectionFactory mqQueueConnectionFactory) {
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
userCredentialsConnectionFactoryAdapter.setUsername(username);
userCredentialsConnectionFactoryAdapter.setPassword(password);
userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
return userCredentialsConnectionFactoryAdapter;
}
如不需要账户密码链接可以跳过此步,直接将mqQueueConnectionFactory注入下一步的缓存连接工厂。
@Bean
@Primary
public CachingConnectionFactory cachingConnectionFactory(UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter) {
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
cachingConnectionFactory.setTargetConnectionFactory(userCredentialsConnectionFactoryAdapter);
cachingConnectionFactory.setSessionCacheSize(500);
cachingConnectionFactory.setReconnectOnException(true);
return cachingConnectionFactory;
}
不配置该类则每次与MQ交互都需要重新创建连接,大幅降低速度。
@Bean
public PlatformTransactionManager jmsTransactionManager(CachingConnectionFactory cachingConnectionFactory) {
JmsTransactionManager jmsTransactionManager = new JmsTransactionManager();
jmsTransactionManager.setConnectionFactory(cachingConnectionFactory);
return jmsTransactionManager;
}
@Bean
public JmsOperations jmsOperations(CachingConnectionFactory cachingConnectionFactory) {
JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
jmsTemplate.setReceiveTimeout(receiveTimeout);
return jmsTemplate;
}
JmsOperations为JmsTemplate的实现接口。
重要:不设置setReceiveTimeout时,当队列为空,从队列中取出消息的方法将会一直挂起直到队列内有消息
可直接使用jmsOperations的convertAndSend(String, Object)方法,第一个参数为队列名称,第二个参数为需发送的对象。
重要:发送的对象需实现序列化接口
@Autowired
JmsOperations jmsOperations;
public void send(User user){
jmsOperations.convertAndSend("QUEUE.USER", user);
}
可直接使用jmsOperations的receiveAndConvert(String)方法,第一个参数为队列名称。
@Autowired
JmsOperations jmsOperations;
public void receive(User user){
jmsOperations.receiveAndConvert("QUEUE.USER");
}
如需使用事务,只需在方法添加注解@Transactional(value = “jmsTransactionManager”)即可。
使用 SpringBoot JMS 集成 IBMMQ 十分的方便。