ActiveMQ基本概念

1 基础概念
ActiveMQ:是Apache出品,最流行的,能力强劲的开源消息总线。是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。
JMS(Java消息服务):是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

2 JMS消息模式
2.1 点对点或队列模式
  每个消息只能有一个消费者。消息的生产者和消费者之间没有时间上的相关性,无论消费者在生产者发送消息的时候是否处于运行状态,它都可以提取消息。


2.2  Pub/Sub 发布/订阅模式
每个消息可以有多个消费者。生产者和消费者之间有时间上的相关性。订阅一个主题的消费者只能消费自它订阅之后发布的消息。

3 Broker节点
代表一个运行MQ的节点。

4. Transport传输方式
ActiveMQ目前支持的Transport有:VM Transport、TCP Transport、NIO Transport、SSL Transport、Peer Transport、UDP Transport、Multicast Transport、HTTP and HTTPS Transport、WebSockets Transport、Failover Transport、Fanout Transport、Discovery Transport、ZeroConf Transport等。
1) VM Transport:允许客户端和Broker直接在VM内部通信,采用的连接不是Socket连接,而是直接的方法调用,从而避免了网络传输的开销。应用场景也仅限于Broker和客户端在同一JVM环境下。
2) TCP Transport:客户端通过TCP Socket连接到远程Broker。配置语法:
tcp://hostname:port?transportOptions
3) HTTP and HTTPS Transport:允许客户端使用REST或者Ajax的方式进行连接。这意味着可以直接使用JavaScript向ActiveMQ发送消息。
4) WebSockets Transport:允许客户端通过HTML5标准的WebSockets方式连接到Broker。

5 持久化存储 Persistence
    消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和ReliableMessaging结合起来应该是很好的保证了消息的可靠传送。
    消息持久性的原理很简单,就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等,然后试图将消息发送给接收者,发送成功则将消息从存储中删除,失败则继续尝试。消息中心启动以后首先要检查制定的存储位置,如果有未发送成功的消息,则需要把消息发送出去。

5.1 AMQ Message Store
    AMQ是一种文件存储形式,它具有写入速度快和容易恢复的特点。消息存储在一个个文件中,文件的默认大小为32M,如果一条消息的大小超过了32M,那么这个值必须设置大一点。当一个存储文件中的消息已经全部被消费,那么这个文件将被标识为可删除,在下一个清除阶段,这个文件被删除。AMQ适用于ActiveMQ5.3之前的版本。
5.2 Kaha Persistence(持久化为文件)
    KahaDB,是一个基于文件支持事务的消息存储器,是一个可靠,高性能,可扩展的消息存储器。KahaDB是基于文件的本地数据库储存形式,虽然没有AMQ的速度快,但是它具有强扩展性,恢复的时间比AMQ短,从5.4版本之后KahaDB做为默认的持久化方式。
默认配置如下:
<persistenceAdapter>
   <kahaDB directory="activemq-data" journalMaxFileLength="32mb"/>
</persistenceAdapter>

// MessageProducer:消息发送者
MessageProducer producer;
// 设置不持久化,实际根据项目决定  
// PERSISTENT:保存到磁盘,consumer消费之后,message被删除。  
// NON_PERSISTENT:保存到内存,消费之后message被清除。  
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);  
// 注意:堆积的消息太多可能导致内存溢出。

宕机后重新启动MQ:


5.3 JDBC Persistence(持久化为数据库)
可以将消息存储到数据库中,例如:MySQL、SQL Server、Oracle、DB2。

配置JDBC适配器:
<persistenceAdapter>
    <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false" />
</persistenceAdapter>

将数据持久化到MySQL中。

  5.3.1 先从http://dev.mysql.com/downloads/connector/j/下载mysql-connector-java-5.*.*- bin.jar包放到:
D:\software\apache-activemq-5.14.2\lib目录下。


  5.3.2 apache-activemq-5.14.2\conf\activemq.xml配置
持久化方式:
<!--
<persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb"/>
        </persistenceAdapter>
        -->
	<persistenceAdapter>  
            <jdbcPersistenceAdapter  dataDirectory="${activemq.base}/data" dataSource="#mysql-ds" useDatabaseLock="false"/>   
        </persistenceAdapter> 


  数据源:
放到broker标签外边
<!-- MySQL DataSource -->  
	<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:3306/activemq?relaxAutoCommit=true"/>  
        <property name="username" value="root"/>  
        <property name="password" value="123456"/>   
        <property name="poolPreparedStatements" value="true"/>   
    </bean> 


启动后自动创建持久化mysql数据库的3张表:
activemq_acks:ActiveMQ的签收信息。
activemq_lock:ActiveMQ的锁信息。
activemq_msgs:ActiveMQ的消息的信息

具体文件见 http://572327713.iteye.com/blog/2347874

5.4 LevelDB Persistence
这种文件系统是从ActiveMQ5.8之后引进的,它和KahaDB非常相似,也是基于文件的本地数据库储存形式,但是它提供比KahaDB更快的持久性。与KahaDB不同的是,它不是使用传统的B-树来实现对日志数据的提前写,而是使用基于索引的LevelDB。
默认配置如下:
<persistenceAdapter>
      <levelDBdirectory="activemq-data"/>
</persistenceAdapter>

http://blog.csdn.net/kobejayandy/article/details/50736479
http://blog.csdn.net/boonya/article/details/51259068




猜你喜欢

转载自572327713.iteye.com/blog/2347624
今日推荐