ActiveMQ快速入门
概述
消息队列是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。ActiveMQ 是 JMS 规范的具体实现;它是 Apache 下的一个项目,采用 Java 语言开发;是一款非常流行的开源消息服务器
ActiveMQ 和 JMS 的关系
JMS 只是定义了一组有关消息传送的规范和标准,并没有真正实现,也就说 JMS 只是定义了一组接口而已;就像 JDBC 抽象了关系数据库访问、JPA 抽象了对象与关系数据库映射、JNDI 抽象了命名目录服务访问一样,JMS 具体的实现由不同的消息中间件厂商提供,比如 Apache ActiveMQ 就是 JMS 规范的具体实现,Apache ActiveMQ 才是一个消息服务系统,而 JMS 不是
JMS
JMS 消息传递模式
点对点传递模式(P2P):消息发送到一个特殊队列(queue), 消费者从队列获取消息,一条消息只能被只能被一个消费者消费
发布/订阅模式(Publish-Subscribe):消息被发送到一个主题上(topic),所有订阅了该主题的消费者,都能接收到消息(就像很多人都能收到订阅的微信公众号的推送一样)
JMS编码总体架构

- 连接工厂对象,创建消息客户端(生产者、消费者)与消息服务端的连接(connection)
- 连接对象,创建回话对象(session)
- 会话对象,创建生产者对象(producer)、消费者对象(consumer)以及消息对象(message)
- 目的地(queue/topic),点对点模式下目的地是队列(queue),发布/订阅模式下目的地是主题(topic),生产者把消息发送到目的地,消费者从目的地接收消息
ActiveMQ
Spring Boot 整合 ActiveMQ
pom.xml
<!-- ActiceMQ -->
<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.12.1</version>
</dependency>
配置文件中添加基本的配置信息,需要注意的是, ActiveMQ 默认是内存模式:in-memory = true,即不安装 ActiveMQ 也可以正常使用,保险起见将这项配置为 false
application.yml
spring:
activemq:
in-memory: false
# ActiveMQ的ip和端口号
broker-url: tcp://127.0.0.1:61616
# ActiveMq账号
user: admin
# ActiveMq密码
password: admin
pool:
# 连接池启动
enabled: true
# 最大连接数
max-connections: 10
jms:
# 为true代表topic模式,为false代表queue模式
pub-sub-domain: false
#pub-sub-domain: true
# 队列名或主题名
myQueue: test.queue
myTopic: test.topic
启动类
@EnableJms
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
队列模式
队列模式下,配置文件中设置为pub-sub-domain: false
配置类
@Configuration
public class ActiveMQConfig {
@Value("${spring.activemq.broker-url}")
private String brokerUrl;
@Value("${spring.activemq.user}")
private String userName;
@Value("${spring.activemq.password}")
private String password;
@Value("${myQueue}")
private String queueName;
@Bean(name = "queue")
public Queue queue() {
return new ActiveMQQueue(queueName);
}
@Bean
public ConnectionFactory connectionFactory(){
return new ActiveMQConnectionFactory(userName, password, brokerUrl);
}
// 在Queue模式中,对消息的监听需要对containerFactory进行配置
@Bean("queueListener")
public JmsListenerContainerFactory<?> queueJmsListenerContainerFactory(
ConnectionFactory connectionFactory
){
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(false);
return factory;
}
}
生产者
@Component
public class Producer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
public void sendMsg(Destination destination , String msg) {
jmsMessagingTemplate.convertAndSend(destination , msg);
System.out.println("send:" + msg);
}
}
消费者
@Component
public class Consumer {
@JmsListener(destination="${spring.activemq.queue-name}", containerFactory="queueListener")
public void receiveMsg(String msg) {
System.out.println("receive:" + msg);
}
}
测试类
@SpringBootTest
class DemoApplicationTests {
@Autowired
private Producer producer;
@Autowired
private Queue queue;
@Test
public void testMethod() {
producer.sendMsg(queue, "hello");
}
}
主题模式
主题模式下,配置文件中配置为pub-sub-domain: true,其余的需要在配置类中将Topic交给 Spring 管理,代码实现大体上与队列模式相似,故不再赘述
对 ActiveMQ 工作模式的补充
queue 模式
该模式主要建立在一个队列上,当连接一个列队时,发送方不需要知道接收方是否正在接收消息,可以直接向 ActiveMQ 发送消息,而发送的消息将直接进入队列中,如果接收方启动着监听,则会向接收方发送消息,若接收方没有接收到消息,则会保存在 ActiveMQ 服务器中,直到接收方接收消息为止。点对点的消息模式可以有多个接收方和发送方,但是一条消息只会被一个接收方接收到,先连上 ActiveMQ 接收方,则会先接收到消息,而之后的接收方则接收不到已被接收过的消息。 Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费
topic 模式
该模式有多个接收方和发送方,但是接收方与发送方存在时间上的依赖,如果发送方发送消息时接收方没有监听消息,那么 ActiveMQ 将不会保存该消息,认为消息已经发送。这个模式还有一个特点就是发送方发送的消息会被所有的接收方接收到,与点对点模式恰恰相反。后面加入的接收方,无法收到之前发送的消息。发布订阅模式下,当发布者消息量很大时,显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费 topic 消息即分组订阅,这样订阅者很容易实现消费能力线性扩展。
多说几句
因为之前的学习过程中,接触 RabbitMQ 的次数比较多,在学习 ActiveMQ 时发现二者区别还是很大的,所以在这里记录一下
ActiveMQ 和 RabbitMQ 的区别
JMS 和 AMQP
要说两个消息队列的区别,首当其冲的就是它们支持的协议了,也是因为协议差别的巨大所以在使用的时候感觉两种消息队列的差别也巨大
JMS 提供了两种消息模型,peer-2-peer(点对点)以及publish-subscribe(发布订阅)模型
AMQP 中,消息路由(messagerouting)和 JMS 存在一些差别,在 AMQP 中增加了 Exchange(交换机) 和 binding(绑定) 的角色。 producer 将消息发送给 Exchange , binding 决定 Exchange 的消息应该发送到那个 queue ,而 consumer 直接从 queue 中消费消息。 queue 和 exchange 的 bind 有 consumer 来决定

尊重每一个原创,从你我开始!
转载请注明原文链接,如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“👍”哦,博主在此感谢你的支持!

浙公网安备 33010602011771号