ActiveMQ
ActiveMQ(Message Queue)内容
- 为什么要使用MQ
- JMS(Java Message Service)规范
- JMS核心的API
- JMS消息类型
- ActiveMQ是什么
- ActiveMQ的特点
- ActiveMQ的安装
- Hello World程序(包括点对点、发布订阅)
- ActiveMQ消息持久化到MySQL(持久化消息、消息选择器)
- 用户注册和异步下发邮件的例子
1. 为什么要使用MQ
主要系统间通信的问题
- 降低系统间的耦合性
- 设置流量缓冲,防止接口被冲垮
- 将非关键链路进行异步化(异步通信)
2. JMS(Java Message Service)java 消息服务
- JMS是JAVA EE规范之一
- JMS规范指出消息的传递应该是异步的、非阻塞的;
3. JMS的核心API
-
ConnectionFactory:创建连接的工场
-
Connection:客户端和MQ服务器的一次连接
-
Session:一次会话,创建消息生产者、消息消费者、消息队列、创建消息
-
Destination:消息目的地
生产者生产消息的目的地
消息者消费消息的来源
Queue
Topic
-
MessageProducer:消息生产者
-
MessageConsumer:消息消费者
-
Message
TextMessage
MapMessage
ObjectMessage
BytesMessage
StreamMessage
-
MessageListener:消息监听器,用于监控队列的消息
4. JMS消息类型
-
点对点消息类型(P2P)
一条消息只能被一个消费者消费
-
发布、订阅类型(Pub/Sub)
一条消息可以被多个消费者消费
生产者和消费者有时间上的依赖性,生产者在发送消息的时候,应该至少有一个消费者处于在线状态;
可以创建一个持久化消费者解决时间依赖性的问题;
5. 什么是ActiveMQ
ActiveMQ是最受欢迎的、功能强大的开源消息传递和集成服务器;
ActiveMQ速度快,支持多语言客户端和协议,非常容易进行企业级集成,包括很多高级特性,完全支持JMS1.1和J2EE1.4。基于Apache2.0许可证开源;
6. ActiveMQ的特点
- 支持多语言客户端和协议,如Java、C、C++、Ruby、Perl、Python、PHP
- 支持许多高级特性,如消息分组、虚拟目的地、通配符、组合目的地;
- 完全支持JMS1.1和J2EE1.4;
- 可以很容易集成到spring应用程序中;
- 通过大部分j2ee服务器的测试,如TomEE、JBoss、WebLogic等;
- 支持高效的JDBC持久化方式;
- 集群的支持;
- …
7. 安装单机版ActiveMQ
-
解压apache-activemq-5.15.3-bin.zip到当前目录
-
启动ActiveMQ
-
Windows
双击
bin/wind64/activemq.bat
-
MAC OS
bin/activemq start
-
-
访问控制台
http端口号:8161
页面访问地址:http://localhost:8161/admin
用户名和密码:都是admin
8. 开发Hello World程序
-
maven依赖
<!-- javax.jms-api --> <dependency> <groupId>javax.jms</groupId> <artifactId>javax.jms-api</artifactId> <version>2.0.1</version> </dependency> <!-- activemq-broker --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-broker</artifactId> <version>5.15.3</version> </dependency> <!-- activemq-pool --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.15.3</version> </dependency>
8.1 测试点对点例子
HelloProducer
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class HelloProducer {
private static final String NAME = null;
private static final String PASSWORD = null;
// 这里的端口号不是8161,而是61616
private static final String URL = "tcp://localhost:61616";
public static void main(String[] args) throws JMSException {
// 1. 创建连接工场ConnectionFactory
ConnectionFactory factory = new
ActiveMQConnectionFactory(NAME, PASSWORD, URL);
// 2. 创建连接,并调用start()
Connection connection = factory.createConnection();
connection.start();
// 3. 创建Session
// 参数(是否开启事务, 消息签收方式)
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
// 4. 创建Destination - Queue
// 这里的参数就是队列名称,如果队列不存在,则自动创建消息队列
Queue queue = session.createQueue("hello");
// 5. 创建消息生产者
MessageProducer producer = session.createProducer(queue);
// 6. 创建消息
for (int i = 1; i <= 10;) {
TextMessage message = session.createTextMessage("这是第" + i++ + &#