ActiveMQ 详细入门教程系列(一)
可以使用消息优先级来指示 JMS Provider 首先提交紧急的消息。优先级分 10 个级别,从 0(最低)到 9(最高)。如果不指定优先级,默认级别是 4。需要注意的是,JMS Pro 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 vider 并不一定保证按照优先级的顺序提交消息。
[](()6.2 消息过期
可以设置消息在一定时间后过期,默认是永不过期。
[](()6.3 临时目的地
可以通过会话上的 createTemporaryQueue 方法和 createTemporaryTopic 方法来创建临时目的地。它们的存在时间只限于创建它们的连接所保持的时间。只有创建该临时目的地的连接上的消息消费者才能够从临时目的地中提取消息。
[](()七、什么是 ActiveMQ
ActiveMQ 是一种开源的基于 JMS(Java Message Servie)规范的一种消息中间件的实现,ActiveMQ 的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件。
官网地址:[http://activemq.apache.org/](()
[](()7.1 存储方式
1. KahaDB 存储: KahaDB 是默认的持久化策略,所有消息顺序添加到一个日志文件中,同时另外有一个索引文件记录指向这些日志的存储地址,还有一个事务日志用于消息回复操作。是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化
特性:
1、日志形式存储消息;
2、消息索引以 B-Tree 结构存储,可以快速更新;
3、 完全支持 JMS 事务;
4、支持多种恢复机制 kahadb 可以限制每个数据文件的大小。不代表总计数据容量。
2. AMQ 方式: 只适用于 5.3 版本之前。 AMQ 也是一个文件型数据库,消息信息最终是存储在文件中。内存中也会有缓存数据。
3. JDBC 存储 : 使用 JDBC 持久化方式,数据库默认会创建 3 个表,每个表的作用如下:
activemq_msgs:queue 和 topic 的消息都存在这个表中
activemq_acks:存储持久订阅的信息和最后一个持久订阅接收的消息 ID
activemq_lock:跟 kahadb 的 lock 文件类似,确保数据库在某一时刻只有一个 broker 在访问
4. LevelDB 存储 : LevelDB 持久化性能高于 KahaDB,但是在 ActiveMQ 官网对 LevelDB 的表述:LevelDB 官方建议使用以及不再支持,推荐使用的是 KahaDB
5.Memory 消息存储: 顾名思义,基于内存的消息存储,就是消息存储在内存中。persistent=”false”,表示不设置持 久化存储,直接存储到内存中,在 broker 标签处设置。
[](()7.2 协议
协议官网 API:[http://activemq.apache.org/configuring-version-5-transports.html](()
Transmission Control Protocol (TCP):
这是默认的 Broker 配置,TCP 的 Client 监听端口是 61616。
在网络传输数据前,必须要序列化数据,消息是通过一个叫 wire protocol 的来序列化成字节流。默认情况下,ActiveMQ 把 wire protocol 叫做 OpenWire,它的目的是促使网络上的效率和数据快速交互。
TCP 连接的 URI 形式:tcp://hostname:port?key=value&key=value
TCP 传输的优点:
(1)TCP 协议传输可靠性高,稳定性强
(2)高效性:字节流方式传递,效率很高
(3)有效性、可用性:应用广泛,支持任何平台
New I/O API Protocol(NIO)
NIO 协议和 TCP 协议类似,但 NIO 更侧重于底层的访问操作。它允许开发人员对同一资源可有更多的 client 调用和服务端有更多的负载。
适合使用 NIO 协议的场景:
(1)可能有大量的 Client 去链接到 Broker 上一般情况下,大量的 Client 去链接 Broker 是被操作系统的线程数所限制的。因此,NIO 的实现比 TCP 需要更少的线程去运行,所以建议使用 NIO 协议
(2)可能对于 Broker 有一个很迟钝的网络传输 NIO 比 TCP 提供更好的性能
NIO 连接的 URI 形式:nio://hostname:port?key=value
Transport Connector 配置示例:
<transportConnectors>
<transportConnector
name="tcp"
uri="tcp://localhost:61616?trace=true" />
<transportConnector
name="nio"
uri="nio://localhost:61618?trace=true" />
</transportConnectors>
User Datagram Protocol(UDP)
1:UDP 和 TCP 的区别
(1)TCP 是一个原始流的传递协议,意味着数据包是有保证的,换句话说,数据包是不会被复制和丢失的。UDP,另一方面,它是不会保证数据包的传递的
(2)TCP 也是一个稳定可靠的数据包传递协议,意味着数据在传递的过程中不会被丢失。这样确保了在发送和接收之间能够可靠的传递。相反,UDP 仅仅是一个链接协议,所以它没有可靠性之说
2:从上面可以得出:TCP 是被用在稳定可靠的场景中使用的;UDP 通常用在快速数据传递和不怕数据丢失的场景中,还有 ActiveMQ 通过防火墙时,只能用 UDP
3:UDP 连接的 URI 形式:udp://hostname:port?key=value
4:Transport Connector 配置示例:
<transportConnectors>
<transportConnector
name="udp"
uri="udp://localhost:61618?trace=true" />
</transportConnectors>
Secure Sockets Layer Protocol (SSL)
1:连接的 URI 形式:ssl://hostname:port?key=value
2:Transport Connector 配置示例:
<transportConnectors>
<transportConnector name="ssl" uri="ssl://localhost:61617?trace=true"/>
</transportConnectors>
[](()八、案例(Hello World)
这里以 windows 为案例演示
下载地址:[http://activemq.apache.org/components/classic/download/](()
[](()8.1 安装启动
解压后直接执行
bin/win64/activemq.bat
[](()8.2 web 控制台
[http://localhost:8161/](()
账号密码:admin/admin
[](()8.3 web 控制台
修改 ActiveMQ 配置文件 activemq/conf/jetty.xml
jettyport 节点: Java 开源项目【ali1024.coding.net/public/P7/Java/git】 配置文件修改完毕,保存并重新启动 ActiveMQ 服务
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<property name="host" value="127.0.0.1"/>
<property name="port" value="8161"/>
</bean>
[](()8.4 开发
1. jar 引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
2. Sender :
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
@program: activemq_01
@ClassName Sender
@description: 消息发送
@author: muxiaonong
@create: 2020-10-02 13:01
@Version 1.0
**/
public class Sender {
public static void main(String[] args) throws Exception{
// 1. 获取连接工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(
ActiveMQConnectionFactory.DEFAULT_USER,
ActiveMQConnectionFactory.DEFAULT_PASSWORD,
"tcp://localhost:61616"
);
// 2. 获取一个向 activeMq 的连接
Connection connection = factory.createConnection();
// 3. 获取 session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4.找目的地,获取 destination,消费端,也会从这个目的地取消息
Queue queue = session.createQueue("user");
// 5.1 消息创建者
MessageProducer producer = session.createProducer(queue);
// consumer --> 消费者
// producer --> 创建者
// 5.2. 创建消息
for (int i = 0; i < 100; i++) {
TextMessage textMessage = session.createTextMessage("hi:"+i);
// 5.3 向目的地写入消息
producer.send(textMessage);
Thread.sleep(1000);
}
// 6.关闭连接
connection.close();
System.out.println("结束。。。。。");
}
面试结束复盘查漏补缺
每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。
以下最新总结的阿里 P6 资深 Java 必考题范围和答案,包含最全 MySQL、Redis、Java 并发编程等等面试题和答案,用于参考~
重要的事说三遍,关注+关注+关注!
更多笔记分享
评论