ActiveMQ持久化机制和JMS可靠消息
1、ActiveMQ持久化机制
1.1 JDBC将数据持久化到数据库
1.2 AMQ生成日志文件
1.3 KahaDB:本次磁盘生成数据文件(默认)
1.4 LevelDB:谷歌K/V数据库
1.5 默认不持久化,正常的开发模式当中,是需要持久化的
DeliveryMode.NON_PERSISTENT = 1 不开启持久化
DeliveryMode.PERSISTENT = 2 开启持久化

1.6 使用JDBC持久化
步骤一:创建一个数据库

步骤二:配置activemq.xml配置文件
1.在persistenceAdapter加入如下配置
<!--createTablesOnStartup 启动是否创建表 第一次为true 后续为false-->
<jdbcPersistenceAdapter dataSource="#activemq-db" createTablesOnStartup="true" />

2.配置数据源

3.将数据库连接Jar放到activemq解压的lib文件夹下

步骤三:重新启动ActiveMQ

数据表解释:
activemq_acks:用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存。
主要的数据库字段如下:
CONTAINER:消息的Destination
SUB_DEST:如果是使用Static集群,这个字段会有集群其他系统的信息
CLIENT_ID:每个订阅者都必须有一个唯一的客户端ID用于区分
SUB_NAME:订阅者名称
SELECTOR:选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,可支持多属性AND和OR操作
LAST_ACKED_ID:记录最后消费过的消息的ID
activemq_lock:在集群环境下才有用,只有一个Broker可以获得消息,称为Master Broker
activemq_msgs:用于存储消息,Queue和Topic都存储在这个表中;
主要的数据库字段如下:
CONTAINER:消息的Destination
MSGID_PROD:消息发送者客户端的主键
MSG_SEQ:是发送消息的顺序,MSGID+PROD+MSG_SEQ可以组成JMS的MessageID
EXPIRATION:消息的过期时间
MSG:消息本体的java序列化对象的二进制数据
PRIORITY:优先级,从0-9,数值越大优先级越高
步骤四:启动提供者后数据表activemq_msgs便增加一条数据


步骤五:消费者启动后数据表消息被删除
由于消费者已经接受消息,队列中数据删除了,所以数据库中的数据也被删除了

2、JMS可靠消息
2.1 带事务的Session
①生产者必须在生产完数据后手动提交session

package com.zn.p2p; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; /**
* 点对点提供者
*/
public class P2P_Provider {
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory=new ActiveMQConnectionFactory();
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:启动连接
connection.start();
//步骤四:获取会话工厂
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//步骤五:创建队列
Queue quque = session.createQueue("MyQueue");
//创建消息生产者
MessageProducer producer = session.createProducer(quque);
//消息持久化 参数1为不做持久化 2为持久化
producer.setDeliveryMode(2);
//模拟消息
TextMessage textMessage = session.createTextMessage("Hello ActiveMQ!");
//发送消息
producer.send(textMessage);
//手动提交消息
session.commit();
System.out.println("生产者生成消息完毕!");
//回收资源
session.close();
connection.close();
}
}
②消费者在消费完数据之后也必须手动提交Session

package com.zn.p2p; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; /**
* P2P消费者
*/
public class P2P_Consumer {
public static void main(String[] args) throws JMSException {
//步骤一:创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory=new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
//步骤二:创建连接
Connection connection = activeMQConnectionFactory.createConnection();
//步骤三:启动连接
connection.start();
//步骤四:获取会话工厂
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//步骤五:创建队列
Queue quque = session.createQueue("MyQueue");
//创建消费者
MessageConsumer consumer = session.createConsumer(quque);
//循环获取消息
while (true){
TextMessage message = (TextMessage)consumer.receive();
session.commit();
if (message!=null){
System.out.println("消费者获取信息:"+message.getText());
}else {
break;
}
}
//回收资源
session.close();
connection.close();
}
}
2.2 不带事务的Session:
①自动签收(不靠谱)

②手动签收

消费者必须显示调用手动签收的方法进行签收,否则队列当中还是存在数据

ActiveMQ持久化机制和JMS可靠消息的更多相关文章
- ActiveMQ持久化机制
用户注册成功后发短信提醒 同步http 异步mq JMS中两种通讯模式: 发布订阅 一对多 topic 去过消费者集群的话 都会消费 消息队列 点对点 queue 去过消费者集群的话 ...
- .Net Core with 微服务 - 分布式事务 - 可靠消息最终一致性
前面我们讲了分布式事务的2PC.3PC , TCC 的原理.这些事务其实都在尽力的模拟数据库的事务,我们可以简单的认为他们是一个同步行的事务.特别是 2PC,3PC 他们完全利用数据库的事务能力,在一 ...
- ActiveMQ的几种消息持久化机制
为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式 ...
- ActiveMQ的消息持久化机制
为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式 ...
- 消息中间件-ActiveMQ高可用集群和持久化机制
1.修改active.mq的xml文件 2.延时.调度消息 package com.study.mq.b1_message; import org.apache.activemq.ActiveMQCo ...
- ActiveMQ持久化消息
ActiveMQ的另一个问题就是只要是软件就有可能挂掉,挂掉不可怕,怕的是挂掉之后把信息给丢了,所以本节分析一下几种持久化方式: 一.持久化为文件 ActiveMQ默认就支持这种方式,只要在发消息时设 ...
- ActiveMQ持久化消息(转)
ActiveMQ的另一个问题就是只要是软件就有可能挂掉,挂掉不可怕,怕的是挂掉之后把信息给丢了,所以本节分析一下几种持久化方式: 一.持久化为文件 ActiveMQ默认就支持这种方式,只要在发消息时设 ...
- ActiveMQ学习系列(四)----消息持久化到mysql
前记:目前学习还比较杂乱,还未找到系统化地学习ActiveMq的方法.在网上看到消息持久化的demo,了解了一下,在此记录. 一.目前ActiveMq支持的持久化方法 url:http://activ ...
- 深入浅出 JMS(三) - ActiveMQ 安全机制
深入浅出 JMS(三) - ActiveMQ 安全机制 一.认证 认证(Authentication):验证某个实体或者用户是否有权限访问受保护资源. MQ 提供两种插件用于权限认证: (一).Sim ...
随机推荐
- Controller生命周期
1. 实例化 alloc/init, initWithNibName 2.awakeFromNib 从nib创建Controller对象 3.get/set outlets 4. viewDidLoa ...
- Linux系统监控 zabbix-agent 主机添加的操作页面
#!/bin/bash#设置解析#安装zabbix源.aliyun YUM源# rpm -ivh http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zab ...
- change事件和input事件的区别
input事件: input事件在输入框输入的时候回实时响应并触发 change事件: change事件在input失去焦点才会考虑触发,它的缺点是无法实时响应.与blur事件有着相似的功能,但与bl ...
- QQ企业通--客户端登陆模块设计---知识点2
Maximizable 属性 获取一个值,该值指定窗口是否可以最大化. fromBorderstyle 成员名称 说明 None 无边框. Fi ...
- kd-tree理论以及在PCL 中的代码的实现(转载)
该文转自:https://www.cnblogs.com/li-yao7758258/p/6437440.html kd-tree理论以及在PCL 中的代码的实现 (小技巧记录:博客园编辑的网页界 ...
- English-Number
English-Number 1. 基数与序数 2. 数量级前缀 3. 与数量级前缀连用的常用单位 4. 数量的完整写法式例 5. 数学符号 6. 其他常用单位 7. 数字的用法 7.1 日期时间 7 ...
- 一套完整的javascript面试题(转)
一.单选题1.以下哪条语句会产生运行错误:(a)A.var obj = ();//语法错误B.var obj = [];//创建数组C.var obj = {};//创建对象D.var obj = / ...
- Day9 - K - Yue Fei's Battle HDU - 5136
Yue Fei is one of the most famous military general in Chinese history.He led Southern Song army in t ...
- 1-2SpringBoot项目属性配置
前面我们讲解了SpringBoot HelloWorld实现 今天具体来讲解上那个application.properties项目配置文件 打开是空白 里面可以配置项目,所以配置项目我们 alt+/ ...
- mysql explain参数解析
建表语句 -- ---------------------------- -- Records of departments -- ---------------------------- INSER ...