笔者最近负责部门的招聘面试,最近在boss上查看很多候选人的简历都有各类mq的使用经。但是面试过程中缺发现很多人都是没有实战经验随意写上去的,这显然是过不了面试的。抛开底层架构和原理不说,其实消息中间件的使用还是很简单的。
接下来的一段时间笔者将会对常用的几大消息中间件,比如RocketMQ、ActiveMQ、RabbitMQ、Kafka等一系列都做下介绍,希望能够帮助大家更快接触和学习使用
现如今微服务普遍推广的年代,分布式系统中消息中间件的运用也越来越重要,那么今天就让我们来了解下ActiveMQ吧
-
首先什么是ActiveMQ呢?
activeMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提>>供高效的、可扩展的、稳定的和安全的企业级消息通信。
MOM的总体思想是它作为消息发送器和接收器之间的消息中介,具体来说是一个实现了JMS规范的系统间远程通信的消息代理。 -
名词解释
Provider:纯 Java 语言编写的 JMS 接口实现(比如 ActiveMQ 就是)
Domains:消息传递方式,包括点对点(P2P)、发布/订阅(Pub/Sub)两种
Connection factory:客户端使用连接工厂来创建与 JMS provider 的连接
Destination:消息被寻址、发送以及接收的对象 -
activeMQ的作用和原理
作用
异步处理、数据同步、流量削峰、缓冲、限流等
原理
生产者生产消息发送给activemq
activemq 接收到消息然后查看有多少个消费者,
然后把消息转发给消费者,此过程中生产者无需参与
消费者接收到消息后做相应的处理和生产者没有任何关系 -
activemq的几种通信方式
publish(发布)-subscribe(订阅)(发布-订阅方式)
发布/订阅方式用于多接收客户端的方式.作为发布订阅的方式,
可能存在多个接收客户端,并且接收端客户端与发送客户端存在时间上的依赖
一个接收端只能接收他创建以后发送客户端发送的信息
作为subscriber ,在接收消息时有两种方法,
destination的receive方法,和实现message listener 接口的onMessage方法 -
如何使用activeMQ?首选注入依赖
ps:笔者当前springboot版本为2.2.0RELEASE
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.15.5</version>
</dependency>
</dependencies>
-
项目架构图如下
-
编写MQ的配置类,这里我们声明queue和topic类型的bean
/**
* @description: ActiveMQConfig
* @author: elegant
* @date: 2020/5/8
*/
@Configuration
public class ActiveMQConfig {
public static final String ACTIVE_QUEUE = "queue_test";
public static final String ACTIVE_TOPIC = "topic_test";
@Bean(name="queue")
public Destination getQueue(){
return new ActiveMQQueue(ACTIVE_QUEUE);
}
@Bean(name="topic")
public Destination getTopic(){
return new ActiveMQTopic(ACTIVE_TOPIC);
}
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setPubSubDomain(true);
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
}
}
- MQ的生产者
/**
* @description: activeMQ生产者
* @author: elegant
* @date: 2020/5/8
*/
@Component
public class ActiveMQProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Resource(name="queue")
private Destination queue;
@Autowired
@Qualifier(value="topic")
private Destination topic;
/**
* ActiveMQConfig
* @param destination
* @param message
*/
public void sendMessage(Destination destination, final String message) {
jmsMessagingTemplate.convertAndSend(destination, message);
}
/**
* sendQueueMessage
* @param message
*/
public void sendQueueMessage(final String message) {
jmsMessagingTemplate.convertAndSend(queue, message);
}
/**
* sendTopicMessage
* @param message
*/
public void sendTopicMessage(final String message) {
jmsMessagingTemplate.convertAndSend(topic, message);
}
- MQ的消费端
/**
* @description: ActiveMQ消费者
* @author: elegant
* @date: 2020/5/8
*/
@Component
public class ActiveMQConsumer {
//接收queue消息
//如果只指定destination那么只会监听queue中的队列的
@JmsListener(destination = ActiveMQConfig.ACTIVE_QUEUE)
public void handler(String message){
System.out.println("接收queue消息成功");
System.out.println(message);
}
//配置多实例消费
//接收topic消息
@JmsListener(destination = ActiveMQConfig.ACTIVE_TOPIC, containerFactory = "jmsListenerContainerTopic")
public void handlerTopic(String msessage){
System.out.println("接收topic消息成功");
System.out.println(msessage);
}
//接收topic消息
@JmsListener(destination = ActiveMQConfig.ACTIVE_TOPIC, containerFactory = "jmsListenerContainerTopic")
public void handlerTopic1(String msessage){
System.out.println("接收topic1消息成功");
System.out.println(msessage);
}
}
- 测试我们的代码
/**
* @description: activemq测试
* @author: elegant
* @date: 2020/5/8
*/
@Slf4j
@RestController
public class ActiveMQController {
@Autowired
private ActiveMQProducer activeMQProducer;
@RequestMapping("/send")
public void sendQueue(){
log.info("test activemq send message start");
activeMQProducer.sendQueueMessage("发送Queue消息");
activeMQProducer.sendTopicMessage("发送Topic消息");
log.info("test activemq send message end ");
}
}
- 启动我们的应用效果如图