SpringBoot 集成 JMS 与 IBMMQ 代码示例教程


前言

SpringBoot 集成 IBMMQ,实现两个服务间的消息通信。


一、集成 JMS 与 IBMMQ

1、pom 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

<dependency>
    <groupId>javax.jms</groupId>
    <artifactId>javax.jms-api</artifactId>
    <version>2.0.1</version>
</dependency>

<dependency>
    <groupId>com.ibm.mq</groupId>
    <artifactId>com.ibm.mq.allclient</artifactId>
    <version>9.1.1.0</version>
</dependency>

2、yml 配置

project:  
  mq:
    host: 192.168.1.180				# 服务地址
    port: 1416						# 服务端口
    queue-manager: queueManager		# 队列管理器
    username: username				# 用户名
    password: password				# 密码
    channel: channel     			# 连接通道
    receive-timeout: 2000     		# 连接超时

3、Properties 配置类

@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;
}

4、Factory 连接工厂类

@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。

5、配置连接认证

@Bean
UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter(MQQueueConnectionFactory mqQueueConnectionFactory) {
    UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
    userCredentialsConnectionFactoryAdapter.setUsername(username);
    userCredentialsConnectionFactoryAdapter.setPassword(password);
    userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
    return userCredentialsConnectionFactoryAdapter;
}

如不需要账户密码链接可以跳过此步,直接将mqQueueConnectionFactory注入下一步的缓存连接工厂。

6、配置缓存连接工厂

@Bean
@Primary
public CachingConnectionFactory cachingConnectionFactory(UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter) {
    CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
    cachingConnectionFactory.setTargetConnectionFactory(userCredentialsConnectionFactoryAdapter);
    cachingConnectionFactory.setSessionCacheSize(500);
    cachingConnectionFactory.setReconnectOnException(true);
    return cachingConnectionFactory;
}

不配置该类则每次与MQ交互都需要重新创建连接,大幅降低速度。

7、配置事务管理器

@Bean
public PlatformTransactionManager jmsTransactionManager(CachingConnectionFactory cachingConnectionFactory) {
    JmsTransactionManager jmsTransactionManager = new JmsTransactionManager();
    jmsTransactionManager.setConnectionFactory(cachingConnectionFactory);
    return jmsTransactionManager;
}

8、配置JMS模板

@Bean
public JmsOperations jmsOperations(CachingConnectionFactory cachingConnectionFactory) {
    JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
    jmsTemplate.setReceiveTimeout(receiveTimeout);
    return jmsTemplate;
}

JmsOperations为JmsTemplate的实现接口。

重要:不设置setReceiveTimeout时,当队列为空,从队列中取出消息的方法将会一直挂起直到队列内有消息

9、消息发送与接收

  1. 发送消息

可直接使用jmsOperations的convertAndSend(String, Object)方法,第一个参数为队列名称,第二个参数为需发送的对象。

重要:发送的对象需实现序列化接口

@Autowired
JmsOperations jmsOperations;

public void send(User user){
  jmsOperations.convertAndSend("QUEUE.USER", user);
}
  1. 接收消息

可直接使用jmsOperations的receiveAndConvert(String)方法,第一个参数为队列名称。

@Autowired
JmsOperations jmsOperations;

public void receive(User user){
  jmsOperations.receiveAndConvert("QUEUE.USER");
}
  1. 开启事务

如需使用事务,只需在方法添加注解@Transactional(value = “jmsTransactionManager”)即可。


总结

使用 SpringBoot JMS 集成 IBMMQ 十分的方便。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用ConfigMap和Secrets配置Spring-Boot应用程序连接IBMMQ的步骤: 1.创建ConfigMap和Secrets对象,用于存储IBMMQ连接参数和身份验证信息。 2.在Spring-Boot应用程序的pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring-boot-starter</artifactId> <version>x.x.x</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-ibmmq-starter</artifactId> <version>x.x.x</version> </dependency> ``` 3.在application.yml文件中添加以下配置: ```yaml ibmmq: host: ${ibmmq.host} port: ${ibmmq.port} queue-manager: ${ibmmq.queue-manager} queue: ${ibmmq.queue} channel: ${ibmmq.channel} username: ${ibmmq.username} password: ${ibmmq.password} ccsid: ${ibmmq.ccsid} receive-timeout: ${ibmmq.receive-timeout} camel: url: ibmmq:queue:${ibmmq.queue}?useMessageIDAsCorrelationID=true mq: constant: queue:///TestQueue?targetClient=1 ``` 4.在Spring-Boot应用程序中创建一个Camel路由器,用于从IBMMQ队列中接收消息并将其发送到另一个队列。 ```java @Component public class MyRouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { from("{{camel.url}}") .to("{{camel.mq.constant}}"); } } ``` 5.在Spring-Boot应用程序中创建一个CamelContext对象,并将Camel路由器添加到该对象中。 ```java @SpringBootApplication public class MyApp { @Autowired private MyRouteBuilder myRouteBuilder; public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } @Bean public CamelContext camelContext() throws Exception { CamelContext camelContext = new DefaultCamelContext(); camelContext.addRoutes(myRouteBuilder); return camelContext; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitemeen太白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值