`

ActiveMQ中的消息持久性

    博客分类:
  • JMS
阅读更多

ActiveMQ中的消息持久性


    ActiveMQ很好的支持了消息的持久性(Persistence)。消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和ReliableMessaging结合起来应该是很好的保证了消息的可靠传送。
 
    消息持久性的原理很简单,就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等,然后试图将消息发送给接收者,发送成功则将消息从存储中删除,失败则继续尝试。消息中心启动以后首先要检查制定的存储位置,如果有未发送成功的消息,则需要把消息发送出去。
 
    对于ActiveMQ,消息的持久化同样是很简单的,仅仅通过配置信息就可以实现。这里主要介绍两种不同的持久化方法。
 
1。High performance journal
    这是ActiveMQ基于开源的HOWL(High-speed ObjectWeb Logger),将HOWL扩展为可以存储任意大小的消息(HOWL只能存储固定大小的记录),实现的一种消息持久化方法。它可以快速的将消息存储在本地文件中,且这种文件是以一种类似数据库的方式管理的。这样,如果你发送了10,000个消息,可能只有很少数的消息没有发送成功,当达到一个checkpoint的时候,journal将一批未成功消息通过JDBC存储到数据库,这样避免了多次的数据库操作,很大程度上提高了性能并且保证了可靠性。
    配置方法非常简单,就是无需配置,呵呵。ActiveMQ默认支持Journal,在activemq.xml配置文件中,可以找到如下信息:
<persistenceAdapter>
    <journaledJDBC journalLogFiles="5" journalLogFileSize="1024" dataDirectory="${activemq.home}/activemq-data"/>
</persistenceAdapter>
这里可以改动的就是journalLogFiles,这个属性是制定默认创建几个数据文件来存储消息。journalLogFileSize为数据文件大小,默认为20MB。dataDirectory指向了存储数据文件的位置。
 
2。使用MySQL进行消息持久化
    ActiveMQ持久几乎所有数据库(因为是通过JDBC把消息存储到数据库的)。方法同样简单,就是配置信息稍微有点变化。
<persistenceAdapter>
    <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
</persistenceAdapter>
其中dataSource指定了所用数据源的名字为mysql-ds。需要在activemq.xml文件中的<broker>标签之外配置数据源。下面是MySql的配置信息。
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
    <property name="username" value="gos2"/>
    <property name="password" value="gos2"/>
    <property name="poolPreparedStatements" value="true"/>
</bean>
    大多数信息的含义是很清楚的,需要注意的是relaxAutoCommit需要设置为true,不知道什么含义。不同数据库的配置信息可能有些不一样,还需要自己再查一下。

    配置文件修改好之后,将所选数据库的JDBC驱动包下载之后放到%ACTIVEMQ_HOME%\lib\下,然后启动%ACTIVEMQ_HOME%\bin\activemq.bat。

!!!需要注意的一个地方是:ActiveMQ使用MySQL持久化消息是,需要首先创建数据库,上面配制信息中可以看到,数据库的名字是activemq。启动activemq.bat之后,会在数据库中创建表。我使用MySQL4.1,出现了max key lengh...错误,原因就是ActiveMQ创建的表使用三个字段的组合作为主键,每个字段时varchar(250),加起来是750个varchar,如果按一个verchar2个字节(据说如果采用utf-8编码,可能会是3个字节??),超出了MySQL允许的1024字节。我曾试图更改MySQL的设置,没有成功,最后手动的那控制台打印出来的SQL语句中的250都换成了100,创建了这个表,然后把其他创建的表删掉。然后重新启动activemq.bat,成功!!!:)
 
    这样,消息中心具有了消息持久化功能,还需要做的就是消息发送者在发送消息的时候要采用JMS中的PERSISTENT模式发送消息。示例代码如下:
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
// 如果不想持久化可用下面语句
//producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
 
这样,你的消息无论怎么发,都可以成功了。
分享到:
评论
1 楼 DEMONU 2015-05-14  
网上都是这些,这种文章。。。

相关推荐

    activeMQ笔记

    如果一个JMS服务离线,那么持久性消息不会丢失但是得等到这个服务恢复联机时才会被传递。所以默认的消息传递方式是非持久性的。即使使用非持久性消息可能降低内务和需要的存储器,并且这种传递方式只有当你不需要...

    activemq的windowns编译库、centos7编译库和mac编译库(含头文件和库文件)

    ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是...使用JDBC和高性能日志支持非常快速的持久性

    ActiveMQ中文手册

    1.2.2 持久性 3 1.2.3 优先级 3 1.2.4 消息过期 3 1.2.5 临时目的地 3 1.2.6 持久订阅 3 1.2.7 本地事务 3 1.3 JMS 规范的变迁 4 2.ActiveMQ 4 2.1 Broker 4 2.1.1 运行Broker 4 2.1.2 嵌入式...

    ActiveMQ-JMS-Tutorial:ActiveMQ是用Java编写的开源消息代理,同时具有完整的Java Message Service JMS客户端。 它提供企业功能,在这种情况下,这意味着促进来自多个客户端或服务器的通信。 受支持的客户端包括通过JMS 1.1的Java以及其他几种跨语言客户端。通过计算机群集等功能来管理通信,并能够使用除虚拟内存,缓存和日记持久性之外的任何数据库作为JMS持久性提供程序。

    ActiveMQ-JMS-教程ActiveMQ是用Java编写的开源消息代理,同时具有完整的Java Message Service JMS...通过计算机群集等功能来管理通信,并能够使用除虚拟内存,缓存和日记持久性之外的任何数据库作为JMS持久性提供程序。

    ActiveMQ.rar

    包括:基本概念、消息结构、可靠性机制、PTP、Pub/Sub、API结构、JMS应用开 发的基本步骤、持久和非持久的Topic等 n 四:用ActiveMQ构建应用 包括:多种启动Broker的方法、单独应用的开发、结合Spring的开发等 n 五...

    实战ActiveMQ集群与应用视频教程.zip

    网盘文件永久链接 1:ActiveMQ入门和消息中间件 2:JMS基本概念和模型 3:JMS的可靠性机制 4:JMS的API结构和开发步骤 ...8:ActiveMQ消息存储持久化 9:ActiveMQ的静态网络链接 10:多线程consumer访问集群 ..........

    Activemq原理文档

    本文档总结了Activemq的所有特性,包括整体架构、消息传输原理、部署、消息存储和通讯机制,文字结合图示,读了这个文档,会对Acitvemq有个非常透彻的了解

    Activemq压测报告

    本文档包含了持久性、非持久性、异步同步和多topic下的所有压测数据,非常清晰的分析了各种压测数据,并且根据原理分析结果的合理性

    activeMQ5.2的jar包及使用实例

    activeMQ5.2的jar包及使用实例,它既支持点到点(point-to-point)(PTP)模型和发布/订阅(Pub/Sub)模型。支持同步与异步消息发送。JDBC持久性管理使用数据库表来存储消息 。

    activemq-artemis:Apache ActiveMQ Artemis的镜像

    ActiveMQ Artemis提供了两种日志持久性类型:NIO(使用Java NIO库)和ASYNCIO,与Linux内核libaio库进行交互。 应尽可能使用ASYNCIO日志类型,因为它在性能方面要优越得多。 ActiveMQ Artemis在源代码发行版中不...

    activemq-5.12-test

    数据持久性可以通过KahaDB文件数据库来实现,也可以通过PostgreSQL数据库来实现。 还可以使用haproxy服务器来测试和查看连接。 借助Jolokia API,可以对代理进行http检查: option httpchk GET /api/jolokia ...

    ActiveMQ从入门到精通(二)

    在上一篇文章中,我们已经明确知道了ActiveMQ并不能保证消费的顺序性,即便我们使用了消息优先级。而在实际开发中,有些场景又是需要对消息进行顺序消费的,比如:用户从下单、到支付、再到发货等。如果

    《JAVA消息服务》PDF]

    构建应用程序使用点至点和发布与订阅消息传递模式使用情况,如交易和持久订阅的功能,使应用程序的可靠消息内实施企业JavaBeans(EJB)的使用REST风格的应用程序和消息驱动bean使用的JMS Spring应用框架 消息是一个...

    RabbitMq实例以及安装包

    尤其是可靠性中的:持久性、投递确认、发布者证实和高可用性。 4.高并发 毋庸置疑,RabbitMQ 最高,原因是它的实现语言是天生具备高并发高可用的erlang 语言。 5.比较关注的比较, RabbitMQ 和 Kafka RabbitMq 比...

    Java消息服务(第2版)

    由于更新了JMS 1.1,第二版还说明了厂商无关的规范将有助于你写基于messaging的应用程序,无论是使用IBM的MQ、Progress软件的SonicMQ、ActiveMQ的,还是其他专有的消息服务。 有了《Java消息服务》,你将可以: ·...

    apache-artemis包

    选择Artemis的原因开源、高可用性、Java编写、高性能的日志保证持久化消息像非持久化消息一样拥有出色的表现、功能齐全、简洁的设计、灵活的集群可以通过不可靠的全球网络创建地理上分布的集群。

    MQ选型之RabbitMQ

    2.持久化消息比较(ZeroMq 不支持,ActiveMq 和RabbitMq 都支持。持久化消息主要是指我们机器在不可抗力因素等情况下挂掉了,消息不会丢失的机制);3.综合技术实现(可靠性、灵活的路由、集群、事务、高可用的队列...

    VOJ:基于Spring MVC框架和ActiveMQ的跨平台在线判断系统

    持久性框架 消息队列 数据库连接池 Verwandlung的起源 2011年,LinkedIn Inc.发布了一个名为的消息队列。 它在Scala中实现并且是开源的。 2012年,阿里巴巴公司发布了一个名为的消息队列,该消息队列基于Kafka。 它...

Global site tag (gtag.js) - Google Analytics