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 ...
随机推荐
- 「NOI2005」维护数列
「NOI2005」维护数列 传送门 维护过程有点像线段树. 但我们知道线段树的节点并不是实际节点,而平衡树的节点是实际节点. 所以在向上合并信息时要加入根节点信息. 然后节点再删除后编号要回退(栈), ...
- linux 从一台服务器向另台服务器复制文件
使用scp命令: sudo scp -P 2222 username@192.168.0.200:/home/db/db_data.sql.gz /home/db/db_data.sql.gz scp ...
- SQL注入之SQLmap
注意:sqlmap只是用来检测和利用sql注入点的,并不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql注入点. 1.
- 编写安全 PHP 应用程序的七个习惯
编写安全 PHP 应用程序的七个习惯 在提及安全性问题时,需要注意,除了实际的平台和操作系统安全性问题之外,您还需要确保编写安全的应用程序.在编写 PHP 应用程序时,请应用下面的七个习惯以确保应 ...
- 初探网络流:dinic/EK算法学习笔记
前记 这些是初一暑假的事: "都快初二了,连网络流都不会,你好菜啊!!!" from 某机房大佬 to 蒟蒻我. flag:--NOIP后要学网络流 咕咕咕------------ ...
- 子组件props接受父组件传递的值 能修改吗?
vue2.0 子组件props接受父组件传递的值,能不能修改的问题整理 父组件代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- 远程服务器使用tensorboard
1 .由于服务器上tensorboard使用的端口是6006,因此,连接ssh时,将服务器的6006端口重定向到自己机器上的16006端口: ssh -L 16006:127.0.0.1:6006 u ...
- for 循环遍历数据,根据不同的条件判断动态渲染页面!
整体的逻辑为:for 循环遍历出数据,在for 循环里判断,根据不同的条件渲染 一.html页面结构 二.css就不再写了 三.JS逻辑代码 var listGroup='' ;k<data.i ...
- 如何对接网建SMS短信通短信验证码接口
1首先注册登录网建SMS网站 http://www.smschinese.cn/ 2.下载Java代码 3.JAVA调用 import java.io.UnsupportedEncodingExce ...
- 2019护网杯baby_forensic
题目名称:baby_forensic题目描述:can you catch the flag?附件:“data.7z” 2019护网杯初赛的一道取证题,比赛时没做出来,赛后又研究了一下. 获取profi ...