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可靠消息的更多相关文章

  1. ActiveMQ持久化机制

    用户注册成功后发短信提醒 同步http 异步mq JMS中两种通讯模式: 发布订阅   一对多  topic   去过消费者集群的话 都会消费 消息队列   点对点 queue  去过消费者集群的话 ...

  2. .Net Core with 微服务 - 分布式事务 - 可靠消息最终一致性

    前面我们讲了分布式事务的2PC.3PC , TCC 的原理.这些事务其实都在尽力的模拟数据库的事务,我们可以简单的认为他们是一个同步行的事务.特别是 2PC,3PC 他们完全利用数据库的事务能力,在一 ...

  3. ActiveMQ的几种消息持久化机制

    为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式 ...

  4. ActiveMQ的消息持久化机制

    为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式 ...

  5. 消息中间件-ActiveMQ高可用集群和持久化机制

    1.修改active.mq的xml文件 2.延时.调度消息 package com.study.mq.b1_message; import org.apache.activemq.ActiveMQCo ...

  6. ActiveMQ持久化消息

    ActiveMQ的另一个问题就是只要是软件就有可能挂掉,挂掉不可怕,怕的是挂掉之后把信息给丢了,所以本节分析一下几种持久化方式: 一.持久化为文件 ActiveMQ默认就支持这种方式,只要在发消息时设 ...

  7. ActiveMQ持久化消息(转)

    ActiveMQ的另一个问题就是只要是软件就有可能挂掉,挂掉不可怕,怕的是挂掉之后把信息给丢了,所以本节分析一下几种持久化方式: 一.持久化为文件 ActiveMQ默认就支持这种方式,只要在发消息时设 ...

  8. ActiveMQ学习系列(四)----消息持久化到mysql

    前记:目前学习还比较杂乱,还未找到系统化地学习ActiveMq的方法.在网上看到消息持久化的demo,了解了一下,在此记录. 一.目前ActiveMq支持的持久化方法 url:http://activ ...

  9. 深入浅出 JMS(三) - ActiveMQ 安全机制

    深入浅出 JMS(三) - ActiveMQ 安全机制 一.认证 认证(Authentication):验证某个实体或者用户是否有权限访问受保护资源. MQ 提供两种插件用于权限认证: (一).Sim ...

随机推荐

  1. Codeforces1307B. Cow and Friend

    本题的难点是可以在y轴正轴动,但也是突破点,知道x轴都是整数,那么对于任意长度来说,能到达的最短是1,最长是本身长度,那么我们就选择最长的距离,跳到一个点,使这个点为再跳就超过终点,那么就可以用2次跳 ...

  2. 设计模式课程 设计模式精讲 17-2 模板方法模式coding

    1 代码演练 1.1 代码演练1 1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法) 1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?) 1 代码演练 1.1 ...

  3. 【动画演示】:JS 作用域链不在话下

    作者:Lydia Hallie译者:前端小智来源:dev 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类, ...

  4. 中山普及Day17——普及

    今天换教室,本来教室多好嘛,易守难攻,结果...今天今天仅下午就被熊抄了2次,熊超真TMD不是人呐,走路连脚步声都没有. 然后,播报分数: 爆0了!!!

  5. Autoit里用多进程模拟多线程

      一直以来Autoit都不支持多线程,因此一些需要同时运行多个循环的操作也就无法实现.这个问题在其它的某些语言里也经常出现,解决的方法就是使用多进程. 所谓多进程,就是同时运行多个子进程,每个子进程 ...

  6. Visual Studio Code 格式化ESlint 的方法

    既然要格式化ESlint,就不得不先介绍一下什么是ESlint.后面再介绍格式化的方法 1.ESlint ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具 ...

  7. Victor and String[Bestcoder #52 1004](回文树)

    题目描述 Victor喜欢玩字符串.他认为一个字符串是迷人的,当且仅当字符串是回文的.Victor想玩n次.每次他都会做以下四种操作中的一种.操作1:在字符串的开头添加一个字符 c.操作2:在字符串的 ...

  8. 基于IntelliJ IDEA的代码评审插件 Code Review Plugin

    一.阿里规范公约 1.左上角 File -> Settings -> Plugins -> 搜索:Alibaba Java Coding Guidelines,安装插件并重启IDEA ...

  9. C 随机数产生

    // ConsoleApplication5.cpp : Defines the entry point for the console application. // #include " ...

  10. Django 连接 Mysql (8.0.16) 失败

    首先,确认数据库配置正确无误: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # or use: mysql.con ...