2.1、ActiveMQ + JmsTemplate 的基本概念

本文详细介绍了如何使用Spring的JmsTemplate与ActiveMQ进行集成,包括Maven依赖配置、连接工厂、队列和主题的声明,以及如何为队列和主题创建JmsTemplate实例。

前言

ActiveMQ 的消息类型分为队列和主题,Spring 为 JMS 的连接提供了一个封装 ——JmsTemplate。这很 Spring,通过 JmsTemplate 可以创建连接、获得会话以及发送和接收消息,我们可以专注于对消息的发送和接收处理,而代码看起来也很简洁。

Maven 依赖

本文涉及到 ActiveMQ、Spring的 JmsTemplate 以及 连接池相关内容,需要配置三个依赖

<dependency>
		<groupId>org.apache.activemq</groupId>
		<artifactId>activemq-all</artifactId>
		<version>5.14.5</version>
	</dependency>
	
	<dependency>  
       	<groupId>org.springframework</groupId>  
       	<artifactId>spring-jms</artifactId>  
       	<version>4.1.6.RELEASE</version>    
       </dependency>
       
       <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-pool2</artifactId>
       <version>2.4.2</version>
 </dependency>
认识 ActiveMQConnectionFactory 和 PooledConnectionFactory

类似于和数据库的连接,在使用 ActiveMQ 的时候,我们的程序也需要先创建连接,这个时候就需要用到连接工厂(ActiveMQConnectionFactory),然而,考虑到创建连接本身也需要消耗资源,所以一般实际环境中都是使用连接池(PooledConnectionFactory) 来提供连接服务。
本例仅配置了简单的属性作为参考。
下面给出连接工厂和连接池的 Bean 声明代码

import org.apache.activemq.pool.PooledConnectionFactory;
import org.apache.activemq.spring.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ActiveMQPooledConnectionFactoryBean {
	//连接工厂
	@Bean(name="activeMQConnectionFactory")
	public ActiveMQConnectionFactory getActiveMQConnectionFactory(){
		ActiveMQConnectionFactory a=new ActiveMQConnectionFactory();
		a.setBrokerURL("tcp://localhost:61616");//我本地已启动 ActiveMQ
		a.setTrustAllPackages(true);
		return a;
	}
	//连接工厂池
	@Bean(name="pooledConnectionFactory")
	public PooledConnectionFactory getPooledConnectionFactory(){
		PooledConnectionFactory p=new PooledConnectionFactory();
		p.setConnectionFactory(getActiveMQConnectionFactory());
		p.setMaxConnections(1);//设置最大连接数
		//其他更多配置略
		return p;
	}
}
认识 ActiveMQQueue 和 ActiveMQTopic

请先回忆一下消费者和生产者的概念
ActiveMQ 的消息类型分为 队列和主题两种。队列消息的特点是一个队列中的消息只能被一个消费者接收,当消息到达队列而没有消费者时,消息会被暂时存储起来,直到下一次消费者的到来。主题消息的特点是,一个消息可以拥有多个消费者,但是当一个消息到达主题而没有消费者的时候,这个消息并不会被存储。
下面是 队列消息(ActiveMQQueue) 和 主题消息 (ActiveMQTopic) 的 Bean 声明,由于一般而言我们会根据业务类型声明多个消息Bean,为了后期使用 Spring 注入功能时按需注入,在声明 Bean 的时候注意三点:
1、给 Bean 设定 name 属性,比如 @Bean(name=“activeMQTopic”)
2、使用传入消息名称的构造方法创建对象,比如 ActiveMQTopic a=new ActiveMQTopic(“topic_test”);
3、命名要结合业务场景,设定规则,以免造成日后管理的混乱

队列 Bean - ActiveMQQueue 的声明
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ActiveMqQueueBeans {
	//测试queue
	@Bean(name="activeMQQueue")
	public ActiveMQQueue getActiveMQQueue(){
		ActiveMQQueue a=new ActiveMQQueue("queue_test");//构造方法同时确定来主题消息的名字
		return a;
	}
}
主题 Bean - ActiveMQTopic 的声明
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ActiveMQTopicBeans {
	//测试topic
	@Bean(name="activeMQTopic")
	public ActiveMQTopic getActiveMQTopic(){
		ActiveMQTopic a=new ActiveMQTopic("topic_test");//构造方法同时确定来队列消息的名字
		return a;
	}
}
认识 JmsTemplate

JmsTemplate 是 Spring 提供的对 JMS 的封装,而 JmsTemplate 的声明也十分简单,仅需设置连接工厂目标消息两个属性。
反过来说,每一个队列或者主题 Bean 都需要单独声明一个 JmsTemplate

为一个主题创建 JmsTemplate

本例为一个 主题 Bean创建 JmsTemplate ,没有使用连接池

import javax.annotation.Resource;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.spring.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsTemplate;
@Configuration
public class JmsTemplateTopicBean {
	//连接工厂
	@Resource(name="activeMQConnectionFactory")
	private ActiveMQConnectionFactory connectionFactory;
	//通过名字指定注入的对象
	@Resource(name="activeMQTopic")
	private ActiveMQTopic activeMQTopic;
	@Bean(name="JmsTemplateTopic")
	public JmsTemplate getJmsTemplateTopic(){
		JmsTemplate j=new JmsTemplate();
		j.setConnectionFactory(connectionFactory);//连接工厂
		j.setDefaultDestination(activeMQTopic);//目标消息
		return j;
	}
}
为一个队列创建 JmsTemplate

本例为一个 队列 Bean创建 JmsTemplate ,同时提供了连接池配置的案例

import javax.annotation.Resource;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.pool.PooledConnectionFactory;
import org.apache.activemq.spring.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsTemplate;
@Configuration
public class JmsTemplateQueueBean {
	//连接工厂
	@Resource(name="pooledConnectionFactory")
	private PooledConnectionFactory pooledConnectionFactory;
	//连接池
	@Resource(name="activeMQConnectionFactory")
	private ActiveMQConnectionFactory connectionFactory;
	//目标消息,通过name属性指定注入对象
	@Resource(name="activeMQQueue")
	private ActiveMQQueue activeMQQueue;
	@Bean(name="JmsTemplateQueue")
	public JmsTemplate getJmsTemplateQueue(){
		JmsTemplate j=new JmsTemplate();
		j.setConnectionFactory(pooledConnectionFactory);//使用连接池
		//j.setConnectionFactory(connectionFactory);//仅使用连接工厂
		j.setDefaultDestination(activeMQQueue);
		return j;
	}
}
参考资料

[1].《Spring 实战 第4版》
[2].https://blog.youkuaiyun.com/winter_chen001/article/details/78409125
[3].https://blog.youkuaiyun.com/u013123635/article/details/78362360
[4].https://www.cnblogs.com/Peter2014/p/8080192.html
[5].https://blog.youkuaiyun.com/wowwilliam0/article/details/81110943
[6].https://blog.youkuaiyun.com/lsj960922/article/details/79926947
[7].https://blog.youkuaiyun.com/wangfengwf/article/details/78966704
[8].https://blog.youkuaiyun.com/hpttlook/article/details/23391967

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值