文章目录
前言
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
本文详细介绍了如何使用Spring的JmsTemplate与ActiveMQ进行集成,包括Maven依赖配置、连接工厂、队列和主题的声明,以及如何为队列和主题创建JmsTemplate实例。
1322

被折叠的 条评论
为什么被折叠?



