ActiveMQ 学习笔记

ActiveMQ 学习笔记

activemq的特性

  1. 多种语言和协议编写客户端。

    语言: Java, C, C++, C#, Ruby, Perl, Python, PHP

    应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP

  2. 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)

  3. 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

  4. 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resourceadaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE1.4商业服务器上

  5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

  6. 支持通过JDBC和journal提供高速的消息持久化

  7. 从设计上保证了高性能的集群,客户端-服务器,点对点

  8. 支持Ajax

  9. 支持与Axis的整合

  10. 可以很容易得调用内嵌JMS provider,进行测试

代码思路总结

-- 用到的对象
1. ConnectionFactory:连接工厂,JMS用它创建连接
2. Connection:JMS客户端到JMS Provider的连接
3. Session:一个发送或接收消息的线程
4. Destination:消息的目的地;消息发送给谁
5. MessageProducer:消息发送者
6. TextMessage message
7. 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar

-- 编写步骤
1. 构造从工厂得到连接对象
   connectionFactory.createConnection()
2. 启动
   connection.start();
3. 获取操作连接
   session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
4. 消息的目的地
   destination = session.createQueue("FirstQueue");
5. 得到消息生成者【发送者】
   producer =session.createProducer(destination);
6. 设置不持久化,此处学习,实际根据项目决定
   producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
7. 构造消息,此处写死,项目就是参数,或者方法获取
   sendMessage(session, producer);

ActiveMQ的多种部署方式

Master-Slave部署方式
  • shared filesystem Master-Slave

  • shared database Master-Slave

  • Replicated LevelDB Store (建议三个以上节点)

    注: 这种主备方式是ActiveMQ5.9以后才新增的特性,使用ZooKeeper协调选择一个node作为master。被选择的master broker node开启并接受客户端连接

Broker-Cluster部署方式
  • 前面的 Master-Slave 的方式虽然能解决多服务热备的高可用问题,但无法解决负载均衡和分布式的问题。 Broker-Cluster 的部署方式就可以解决负载均衡的问题。

    1) static Broker-Cluster部署

    在activemq.xml文件中静态指定Broker需要建立桥连接的其他Broker:

    1.首先在Broker-A节点中添加networkConnector节点:


Master-Slave与Broker-Cluster相结合的部署方式
  • Master-Slave的部署方式虽然解决了高可用的问题,但不支持负载均衡,Broker-Cluster解决了负载均衡,但当其中一个Broker突然宕掉的话,那么存在于该Broker上处于Pending状态的message将会丢失,无法达到高可用的目的。

  • 由于目前ActiveMQ官网上并没有一个明确的将两种部署方式相结合的部署方案,所以我尝试者把两者结合起来部署:

部署的配置修改

     这里以Broker-A + Broker-B建立cluster,Broker-C作为Broker-B的slave为例:

1)首先在Broker-A节点中添加networkConnector节点:

<networkConnectors> 
    <networkConnector   uri="masterslave:(tcp://0.0.0.0:61617,tcp:// 0.0.0.0:61618)" duplex="false"/>
</networkConnectors>

2)修改Broker-A节点中的服务提供端口为61616:

<transportConnectors>
    <transportConnectorname="openwire"uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

3)在Broker-B节点中添加networkConnector节点:

<networkConnectors> 
    <networkConnector uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>
</networkConnectors>

4)修改Broker-B节点中的服务提供端口为61617:

<transportConnectors>
    <transportConnectorname="openwire"uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

5)修改Broker-B节点中的持久化方式:

<persistenceAdapter>
    <kahaDB directory="/localhost/kahadb"/>
</persistenceAdapter>

6)在Broker-C节点中添加networkConnector节点:

<networkConnectors> 
    <networkConnector   uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>
</networkConnectors>

7)修改Broker-C节点中的服务提供端口为61618:

<transportConnectors>
    <transportConnectorname="openwire"uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

8)修改Broker-B节点中的持久化方式:

<persistenceAdapter>
    <kahaDB directory="/localhost/kahadb"/>
</persistenceAdapter>

9)分别启动broker-A、broker-B、broker-C,因为是broker-B先启动,所以“/localhost/kahadb”目录被lock住,broker-C将一直处于挂起状态,
当人为停掉broker-B之后,broker-C将获取目录“/localhost/kahadb”的控制权,重新与broker-A组成cluster提供服务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值