springboot整合activemq
前言:
对于刚开始接触activemq的人来说,首先要了解的activemq是什么、干啥用的,然后了解它的优缺点,最后知道它在项目中如何使用。
一、是什么、干啥用的?
activemq是一个消息队列,它是有Apache研发的开源中间件,使用java语言编写。主要作用是:解耦、异步、削峰。
二、优点
- 老牌的消息队列,稳定
- 使用Java语言编写,源码可以清晰解读(如果你是java程序员)
- 对JMS支持最好
三、缺点
- 底层采用多线程并发,对资源消耗比较大
- 版本更新缓慢,集群需要依赖zookeeper实现。
四、 与springboot整合
市面上绝大多数中间件在与spring整合的时候无疑就三步,导入jar包,添加相应的配置,通过注解或者配置文件在项目中使用。好了废话不多说我们直接上代码。
1. pom.xml
<!--消息队列连接池-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.15.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
我这里使用的是5.15.0版本的。
- 在application中配置
spring.activemq.broker-url= tcp://localhost:61616
#pring.activemq.password=admin
spring.activemq.user=admin
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=10
queueName: publish.queue
topicName: publish.topic
这里主要说明的是,我这里的配置文件时application.properties,所以我是这样配置的。但是如果你的配置文件时application.yml就不要这样配置了。按照yml的格式配置,但是里面的配置参数都是一样的。(关于actiovemq的配置参数,我下篇会做详细的讲解,如果你的项目小的话,这几个参数就够了!)
2.代码中编写配置类
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import javax.jms.Queue;
import javax.jms.Topic;
@EnableJms
@Configuration
//@PropertySource("${mq.config.url}")
//@PropertySource("classpath:application-dev.properties")
public class ActivemqConfig {
@Value("${spring.activemq.user}")
private String usrName;
@Value("${spring.activemq.password}")
private String password;
@Value("${spring.activemq.broker-url}")
private String brokerUrl;
@Value("${queueName}")
private String queueName;
@Value("${topicName}")
private String topicName;
@Bean
public Queue queue(){
return new ActiveMQQueue(queueName);
}
@Bean
public Topic topic(){
return new ActiveMQTopic(topicName);
}
@Bean
public ActiveMQConnectionFactory connectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(usrName, password, brokerUrl);
return activeMQConnectionFactory;
}
@Bean("QueueListenerFactory")
public JmsListenerContainerFactory jmsListenerContainerQueue(ActiveMQConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setConnectionFactory(connectionFactory);
bean.setSessionTransacted(false);
bean.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return bean;
}
@Bean
@Qualifier("TopicListenerFactory")
public JmsListenerContainerFactory jmsListenerContainerTopic(ActiveMQConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
//设置为发布订阅方式, 默认情况下使用的生产消费者方式
bean.setPubSubDomain(true);
bean.setConnectionFactory(connectionFactory);
return bean;
}
@Bean
public JmsMessagingTemplate jmsMessageTemplate(){
return new JmsMessagingTemplate(connectionFactory());
}
}
这里我给大家讲解一下里面的代码,我们在整合mq的时候首先要在class上面添加一个@EnableJms注解,作用时让springboot知道我引入了一个activemq,然后让他交给spring去管理。然后@Configuration注解说明这个class文件是个配置类。
class里面的内容:第一个bean,我们创建一个activemq的连接工厂,然后连接到activemq;第二个bean,我们配置队列模式(点对点),第三个bean是配置主题模式(广播),第四个bean是我们配置activemq的发送模板
3.消费者
@JmsListener(destination = "aa" ,containerFactory = "QueueListenerFactory")
public void getaaData(Message message){
TextMessage msg = (TextMessage) message;
try {
..业务代码,如增删改查
message.acknowledge();//收到确认
} catch (JMSException e) {
e.printStackTrace();
}
}
@JmsListener(destination = “接收消息的名称” ,containerFactory = “接收消息的工厂,队列或者主题的bean名(我们在配置文件中的第2,3个bean的名称)”)
4.生产者
@Autowired
JmsMessagingTemplate jmsMessageTemplate
@RequestMapping
public void send(){
jmsMessageTemplate.convertAndSend("队列名称","发送的消息");
}
activemq在springboot中最基本的讲解接算完了,感谢你的观看!!!!