当前位置: 首页 > 编程日记 > 正文

ActiveMQ消息存储持久化

转https://www.cnblogs.com/xinhuaxuan/p/6128380.html

https://blog.csdn.net/lr131425/article/details/68064914

为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制。

就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等,然后试图将消息发送给接收者,发送成功则将消息从存储中删除,失败则继续尝试。

ActiveMQ提供了插件式的消息存储,主要有有如下几种:

1.AMQ消息存储-基于文件的存储方式,是以前的默认消息存储

2.KahaDB消息存储-提供了容量的提升和恢复能力,是现在的默认存储方式

3.JDBC消息存储-消息基于JDBC存储的

4.Memory消息存储-基于内存的消息存储

(1)kahaDB Message Store概述
  KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址。
  KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化。在kaha中,数据被追加到 data logs中。 当不再需要log文件中的数据的时候,log文件会被丢弃。
  KahaDB基本配置如下:

其配置位于activemq.xml文件中

可用的属性有:
1. director: KahaDB存放的路径,默认值activemq-data
2. indexWriteBatchSize: 批量写入磁盘的索引page数量,默认值为1000
3. indexCacheSize: 内存中缓存索引page的数量,默认值10000
4. enableIndexWriteAsync: 是否异步写出索引,默认false
5. journalMaxFileLength: 设置每个消息data log的大小,默认是32MB
6. enableJournalDiskSyncs: 设置是否保证每个没有事务的内容,被同步写入磁盘,JMS持久化的时候需要,默认为true
7. cleanupInterval: 在检查到不再使用的消息后,在具体删除消息前的时间,默认30000
8. checkpointInterval: checkpoint的间隔时间,默认是5000
9. ignoreMissingJournalfiles: 是否忽略丢失的消息日志文件,默认false
10. checkForCorruptJournalFiles: 在启动的时候,将会验证消息文件是否损坏,默认false
11. checksumJournalFiles: 是否为每个消息日志文件提供checksum,默认false
12. archiveDataLogs: 是否移动文件到特定的路径,而不是删除它们,默认false
13. directoryArchive: 定义消息已经被消费过后,移动data log到的路径,默认null
14. databaseLockedWaitDelay: 获得数据库锁的等待时间(used by shared master/slave),默认10000
15. maxAsyncJobs: 设置最大的可以存储的异步消息队列,默认值10000,可以和concurrent MessageProducers设置成一样的值。
16. concurrentStoreAndDispatchTransactions:是否分发消息到客户端,同时事务存储消息,默认true
17. concurrentStoreAndDispatchTopics: 是否分发Topic消息到客户端,同时进行存储,默认true
18. concurrentStoreAndDispatchQueues: 是否分发queue消息到客户端,同时进行存储,默认true

(2)AMQ Message Store概述

AMQ Message Store是ActiveMQ5.0缺省的持久化存储,它是一个基于文件、事务存储设计为快速消息存储的一个结构,该结构是以流的形式来进行消息交互的。
  这种方式中,Messages被保存到data logs中,同时被reference store进行索引以提高存取速度。Data logs由一些简单的data log文件组成,缺省的文件大小是32M,如果某个消息的大小超过了data log文件的大小,那么可以修改配置以增加data log文件的大小。如果某个data log文件中所有的消息都被成功消费了,那么这个data log文件将会被标记,以便在下一轮的清理中被删除或者归档。
  AMQ Message Store配置示例:

(3)使用JDBC来持久化消息

ActiveMQ支持使用JDBC来持久化消息,预定义的表如下:
1.消息表,缺省表明为ACTIVEMQ_MSGS, queue和topic都存储在里面,结构如下:

2.ACTIVEMQ_ACKS表存储持久订阅的信息和最后一个持久订阅接收的消息ID,结构如下:

3.锁定表,缺省表名为ACTIVEMQ_LOCK,用来确保在某一时刻,只能有一个ActiveMQ broker实例来访问数据库,结构如下:

使用JDBC来持久化消息的配置示例:
在activemq.xml中的配置如下:

复制代码
 1 <broker brokerName="test-broker" persistent=true xmlns="http://activemq.apache.org/schema/core">2   <persistenceAdapter>3     <jdbcPersistenceAdapter dataSource="#mysql_ds">4   </persistenceAdapter>5 </broker>6 <bean name="mysql_ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">7   <property name="driverClassName">8     <value>org.gjt.mm.mysql.Driver</value>9   </property>
10   <property name="url">
11     <value>jdbc:mysql://192.168.1.102:3306/test?useUnicode=true&amp;characterEncoding=UTF-8</value>
12   </property>
13   <property name="username">
14     <value>root</value>
15   </property>
16   <property name="password">
17     <value>123123</value>
18   </property>
19 </bean>
复制代码

JDBC Message Store with ActiveMQ Journal
这种方式克服了JDBC Store的不足,使用快速的缓存写入技术,大大提高了性能。
配置如下:

复制代码
1 <beans>
2   <broker brokerName="test-broker" xmlns="http://activemq.apache.org/schema/core">
3     <persistenceFactory>
4     <journalPersistenceAdapterFactory journalLogFiles="4" journalLogFileSize="32768"
5       useJournal="true" useQuickJournal="true" dataSource="#mysql_ds" dataDirectory="activemq-data">
6     </persistenceFactory>
7   </broker>
8 </beans>
复制代码

JDBC Store和JDBC Message Store with ActiveMQ Journal的区别
  1. JDBC with journal的性能优于jdbc
  2. JDBC用于master/slave模式的数据库分享
  3. JDBC with journal不能用于master/slave模式
  4. 一般情况下,推荐使用jdbc with journal 
(4)Memory Message Store
  内存消息存储主要是存储所有的持久化的消息在内存中。这里没有动态的缓存存在,所以你必须注意设置你的broker所在的JVM和内存限制。

1 <beans>
2   <broker brokerName="test_broker" persistent="false" xmlns="http://activemq.apache.org/schema/core">
3     <transportConnectors>
4     <transportConnector uri="tcp://localhost:61635">
5     </transportConnectors>
6 </beans>

转载于:https://www.cnblogs.com/miye/p/9401771.html

相关文章:

python 非_Python函数的非固定参数

一、概述在原来的文章中我已经写了&#xff0c;位置参数和关键字参数&#xff0c;下面我们来谈谈默认参数和参数组二、默认参数默认参数指的是&#xff0c;我们在传参之前&#xff0c;先给参数制定一个默认的值。当我们调用函数时&#xff0c;默认参数是非必须传递的。默认参数…

C#关于面对象多态例子

//主的喂狗 class Program { static void Main(string[] args) { //我们来模拟一个主人养狗动物的例子 首先创建一个主人对象,同时主人买了条狗 //买来条狗&#xff0c;主人一喂&#xff0c;狗会吃东西 Person person ne…

ubuntu package XXX needs to be reinstalled,but I can't find an archive 问题修复

ubuntu package XXX needs to be reinstalled, but I can’t find an archive 修复 原文连接: https://blog.csdn.net/tbitwqb/article/details/78241101 内容&#xff1a; 不知道什么原因&#xff0c;可能是升级过程过关机或者其他什么情况导致当前问题的发生。 无论是apt…

CentOS6.2解决passwd: Authentication token manipulation error报错

passwd: Authentication token manipulation error这种错误可能有多种原因&#xff0c;就我了解的可能有/etc/passwd等文件i权限 今天在给学员上课的时候发现提示passwd: Authentication token manipulation error错误&#xff0c;我来简单描述今天的问题 [roothost4 Scripts]#…

Java核心技术第五章——2.Object类

Object类&#xff1a;所有类的超类 Object类是Java中所有类的始祖&#xff0c;在Java中每个类都是由它扩展而来的。但是并不需要这样写&#xff1a; public class Emloyee extends Object 如果没有明确的指出超类&#xff0c;Object就被认为是这个类的超类。在Java中&#xff0…

21day学通python_铁乐学python_day21_面向对象编程3

抽象类和接口类以下内容大部分摘自博客http://www.cnblogs.com/Eva-J/继承有两种用途&#xff1a;一&#xff1a;继承基类的方法&#xff0c;并且做出自己的改变或者扩展(代码重用)二&#xff1a;声明某个子类兼容于某基类&#xff0c;定义一个接口类Interface&#xff0c;接口…

系统crash无法启动 tpm error / could not read size 0x8000000e

系统crash无法启动 tpm error / couldn’t read size 0x8000000e 原文连接: https://unix.stackexchange.com/questions/305719/a-tpm-error-7-occurred-attempting-to-read-a-pcr-value-in-centos 内容&#xff1a; 问题&#xff1a; I’m getting this error while booting…

ASP.NET文件的下载

/// <summary>/// 下载文件/// </summary>/// <param name"filePath">文件的路径</param>/// <param name"fileName">文件名(有时候文件名存在数据库中用于替换路径中的文件名)</param>public void FileDownLoad(stri…

TestLink1.9.3测试用例:Excel转换XML工具一

最近在整理测试用例&#xff0c;所以想找一个合适的工具来完成对测试需求、测试用例的管理。对比了一翻&#xff0c;发现开源工具中扩展比较好的还属TestLink&#xff0c;而且还可以与JIRA进行对接&#xff0c;这样就引起了我更大的兴趣。加上之前本来就接触过此工具&#xff0…

MYSQL 使用自定义表变量

mysql 用户自定义表变量&#xff0c;ENGINEMyISAM DEFAULT CHARSETgb2312; 制定编码方式&#xff0c;防止乱码 DROP TABLE IF EXISTS p_temp; create temporary TABLE p_temp ( RowIndex int ,PRIMARY KEY (RowIndex))ENGINEMyISAM DEFAULT CHARSETgb2312; 转载于:https:/…

early EOF fatal: index-pack failed

early EOF fatal: index-pack failed 原文链接: https://stackoverflow.com/questions/21277806/fatal-early-eof-fatal-index-pack-failed 内容: First, turn off compression: git config --global core.compression 0 Next, let’s do a partial clone to truncate the a…

linux下运行python unitest_Python unittest打印日志可以在Linux上运行,但在Windows上不行...

我正在尝试编写一个unittest&#xff0c;它将stdout和stderr重定向到一个写在Windows网络驱动器上的文件。出于某些原因&#xff0c;相同的脚本(只有diff.是目录路径)可以在Linux上工作&#xff0c;但在Windows上不行。在Windows上运行时&#xff0c;不会将任何内容写入日志文件…

emacs 探索之五:latex配置

最近需要使用Latex写论文&#xff0c;之前一直在用emacs&#xff0c;而且渐渐理解emacs的思想之后发现大多数事情都能够在emacs中完成&#xff0c;那么自然会想到emacs是否能够与latex相结合。Google一下发现好多方式&#xff0c;当前前提是需要安装latex软件&#xff0c;然后e…

自动填充脚本使用及注意事项

网站开发需要&#xff0c;找了几个js脚本&#xff0c;最后选择了jQuery Autocomplete Mod&#xff08;http://www.pengoworks.com/workshop/jquery/autocomplete.htm&#xff09; 稍作修改&#xff0c;改动处见中文注释 1 jQuery.autocomplete function(input, options) {2 …

FFmpeg 与媒体文件关系

1. 容器/文件&#xff08;Container/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如MP4&#xff0c;flv&#xff0c;mov等。 2. 媒体流&#xff08;Stream&#xff09;&#xff1a;表示在时间轴上的一段连续的数据&#xff0c;比如一段声音数据、一段视频…

一些可能没用过的调试窗口

首先说明&#xff1a;如果没有进入调试模式的话&#xff0c;默认的调试窗口如下&#xff1a; 开始前的准备&#xff1a; 新建控制台程序DebugWindowDemo&#xff1a; 修改Program.cs 的代码为&#xff1a; using System; using System.Threading; using System.Threading.Tasks…

linux 系统崩溃完全没有操作空间的系统修复

linux 系统崩溃完全没有操作空间的系统修复 1、通过U盘系统启动 2、修复文件系统 https://editor.csdn.net/md/?articleId106213788 此时硬盘会被挂在到U盘系统下作为一个目录, 例如/dev/sda2 修复它: fsck -y /dev/sda2很多时候都有效 3、修复grub

搜索进程内存地址_Linux编程 6 (查看进程 ps 及输出风格)

一&#xff0e;查看进程命令ps1.1 默认ps 命令在默认情况下&#xff0c;ps命令只会显示运行在当前控制台下&#xff0c;属于当前用户的进程&#xff0c;在上图中&#xff0c;我们只运行了bash shell以及ps命令本身。 上图中显示了程序的进程ID(1538,1583)&#xff0c;它们运行在…

关于最大子段和线性算法的证明

重复题目: 输入一个整形数组&#xff0c;数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组&#xff0c;每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 此题最初载于 http://blog.csdn.net/v_JULY_v/article/details/6444021 我在文…

SQL Server使用侦听器IP访问时遇到The target principal name is incorrect. Cannot generate SSPI context...

SQL Server使用侦听器IP访问时遇到"The target principal name is incorrect. Cannot generate SSPI context" 原文:SQL Server使用侦听器IP访问时遇到"The target principal name is incorrect. Cannot generate SSPI context"在测试SQL Server 2016 Alwa…

linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

linuxQt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html D-Bus概述 什么是D-Bus&#xff1f; D-Bus是一种进程间通信的机制&#xff0c;它被设计成为一种低开销、低延迟的IPC&#xff0c;并被多种桌面环…

xbmc-12.0稳定版代码初探 (2) —— XBMC_HOME

XBMC工程在debug时要设置XBMC_HOME的环境 用于指定ffmpeg的Dll文件位置&#xff0c;语言等等 xbmc/filesystem/SpecialProtocol.cpp 定义了一些如&#xff1a; CSpecialProtocol::SetXBMCPath();的函数 xbmc\Application.cpp InitDirectoriesWin32(); -> CUtil::GetHomePat…

python是最好的语言 永远二十岁_Python是世界上最好的语言吗?

编程语言的选择是IT圈子永远的争议。在任意一个程序员聚集的场合&#xff0c;喊一句类似于“PHP是世界上最好的语言”这样的话&#xff0c;肯定会惹来不少人和你争论得面红耳赤。那么&#xff0c;python是世界上最好的语言吗&#xff1f;这个我不敢说&#xff0c;但是至少他应该…

(转)Android笔记--handler机制

一、重要参考资料 【参考资料】目前来看&#xff0c;下面的几个网址中的内容质量比较不错&#xff0c;基本不需要再读别的网址了。1、android消息机制一http://xtfncel.javaeye.com/blog/6635172、Android消息机制二http://xtfncel.javaeye.com/blog/6635183、Android线程间通信…

自制操作系统Antz(9)——实现内核 (下) 实现图形化界面

Antz系统更新地址&#xff1a; https://www.cnblogs.com/LexMoon/category/1262287.html Linux内核源码分析地址&#xff1a;https://www.cnblogs.com/LexMoon/category/1267413.html Github项目地址&#xff1a;https://github.com/CasterWx/AntzOS 在前几天的任务中&#xff…

python迷宫万花筒代码_利用广度优先遍历搜索迷宫的python源代码

广度优先遍历简称为DFS&#xff0c;是数据结构中比较常用的一个算法&#xff0c;主要原理是采用队列先进先出的规则&#xff0c;一层一层的访问图的节点。而迷宫问题接近与遍历&#xff0c;但是不同于遍历&#xff0c;主要考虑是采用栈的形式标记路径&#xff0c;并对当前节点和…

联想拯救者Y9000-ubuntu-nvidia-驱动安装

概述 由于联想拯救者Y9000的硬件都比较新&#xff0c;所以在安装ubuntu 的时候会有很多驱动的问题&#xff0c;本文主要讲解安装nvidia驱动的问题&#xff0c;如网卡、触摸板无效的其他问题请在我的其他文章中查找 友情提示 安装完系统之后先插网线装ssh服务&#xff0c; 确…

修改远程桌面端口

修改远程桌面端口需要两个步骤&#xff1a;  1、打开注册表 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]&#xff0c;修改右边PortNamber的值&#xff0c;其默认值是3389&#xff0c;修改成所希望的端口即可&#xff0c;例如3…

开发管理 CheckLists(4) -风险管理

本文章主要介绍在项目启动前怎么样分步骤的去识别风险,才去什么方式去识别风险. 有需要做风险识别的朋友可以按照下面的步骤简单的走上一遍,或者可以提高项目的成功率 注意&#xff1a;本文章只是你做风险识别的chekcLists ,上面提到的一些分析方法都只是简单的介绍…

python的深拷贝与浅拷贝

对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 两个变量的内容其实为一个地址,如果要在复制的同时分配新的地址则需要用到深拷贝和浅拷贝的命令 lst1 ["何炅", "杜海涛","周渝⺠", ["麻花藤", …