- activeMQ安装
- activeMQ的应用场景
- JMS的概念和模型
- 通过JMS的api去实现了一个p2p的发送代码
- JMS的消息结构组成:消息头、消息体、消息属性
- JMS的域模型(点对点、pub/sub)
- JMS的可靠性机制
- 事务型: session.commit
- 非事务型: ack类型 :AUTO_ACK / CLIENT_ACK /DUPS_ACK
- 本地事务、消息的持久性
- 轻量级的Broker。自己启动一个broker实例
- spring+activeMQ整合
- 持久化和非持久化发送策略
- consumer消费消息是pull还是push (prefetchSize)
- 传输协议(client-broker) tcp/nio/udp/http(s)/vm/ssl
- 消息持久化策略
- kahadb
- AMQ
- JDBC
- 内存
- levelDB
- activeMQ高性能策略(networkConnector)
- 静态网络连接
- 动态网络连接
应用场景
1,异步消息 2,应用解耦 3,流量销峰
安装ActiveMQ
- 下载activeMq安装包
- tar -zxvf **.tar.gz
- sh bin/activemq start 启动activeMQ服务
active 是一个web应用程序,启动在内置的jetty中。 在active-mq 的/conf 中jetty的配置 jetty.xml
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8161"/>
</bean>
启动activeQM之后 可以使用ip:port(8161)的方式访问 activeQM 管理平台
什么是MOM
面向消息的中间件,使用消息传送提供者来协调消息传输操作。 MOM需要提供API和管理工具。 客户端调用api。 把消息发送到消息传送提供者指定的目的地
在消息发送之后,客户端会技术执行其他的工作。并且在接收方收到这个消息确认之前。提供者一直保留该消息。
JMS的概念和规范
Java消息服务(java message service) 是java平台中面向消息中间件的API,用于在两个应用程序之间或分布式系统中 发送消息进行异步通信。绝大对数MOM供应商都对JMS提供了支持。
消息传递域
点对点(p2p)
- 每个消息只能有一个消费者
- 消息的生产者和消费者之间没有时间上的相关性。无论消费者在生产者发送消息的时候是否处于运行状态,都可以提取消息
发布订阅(pub/sub)
- 每个消息可以有多个消费者
- 生产者和消费者之间存在时间上的相关性,订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS规范允许提供客户端创建持久订阅
JMS API
ConnectionFactory 连接工厂
Connection 封装客户端与JMS provider 之间的一个虚拟连接
Session 生产和消费信息的一个单线程上下文;用于创建producer,consumer,message,queue...\
Destination 消息发送或消息接收的目的地
MessageProducer/MessageConsumer 消息提供者和消费者
消息组成
消息头:包含消息的识别信息和路由信息
消息体:TextMessage/ MapMessage/ BytesMessage/ StreamMessage / ObjectMessage (可序列化对象)
属性:
JMS的可靠性机制
JMS 消息在消费端被确认之后,才认为是被成功消费。消息的消费包含三个阶段 客户端接收消息、客户端处理消息、消息被确认
事务性会话
Session session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
设置为true的时候,在消费端 message会在session.commit()之后自动签收
非事务性会话
Session session=connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);
当非事务性会话时 消息何时被确认 取决于创建会话时的应答模式
AUTO_ACKNOWLEDGE
当客户端成功从recive方法返回以后,或者[MessageListener.onMessage] 方法成功返回以后,会话会自动确认该消息
CLIENT_ACKNOWLEDGE client_acknowledge
客户端通过调用消息的textMessage.acknowledge(); 确认消息。
在这种模式中,如果一个消费者消费一共是10个消息,那么消费了5个消息,然后在第5个消息通过textMessage.acknowledge(),那么之前的所有消息都会被确认消费
DUPS_OK_ACKNOWLEDGE
延迟确认
本地事务
在一个JMS客户端,可以使用本地事务来组合消息的发送和接收。JMS Session 接口提供了commit和rollback方法。
JMS Provider会缓存每个生产者当前生产的所有消息,直到commit或者rollback,commit操作将会导致事务中所有的消息被持久存储;rollback意味着JMS Provider将会清除此事务下所有的消息记录。在事务未提交之前,消息是不会被持久化存储的,也不会被消费者消费
事务提交意味着生产的所有消息都被发送。消费的所有消息都被确认;
事务回滚意味着生产的所有消息被销毁,消费的所有消息被恢复,也就是下次仍然能够接收到发送端的消息,除非消息已经过期了
JMS (pub/sub)模型
- 订阅可以分为非持久订阅和持久订阅
- 当所有的消息必须接收的时候,则需要用到持久订阅。反之,则用非持久订阅
JMS (P2P)模型
- 如果session关闭时,有一些消息已经收到,但还没有被签收,那么当消费者下次连接到相同的队列时,消息还会被收到
- 如果用户在receive方法中设定了消息选择条件,那么不符合条件的消息会留在队列中不会被接收
- 队列可以长久保存消息直到消息被消费者签收。消费者不需要担心因为消息丢失而时刻与jms provider保持连接状态
Broker
每个active MQ 进程实例都是一个 broker 可以实现自己的broker
BrokerService brokerService=new BrokerService();
try {
brokerService.setUseJmx(true);
brokerService.addConnector("tcp://localhost:61616");
brokerService.start();
} catch (Exception e) {
e.printStackTrace();
}
JMS和MQ的关系:
JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。
而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。
支持JMS的开源MQ:
目前选择的最多的是ActiveMQ。
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。
ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
主要特点:
1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WSNotification,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 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上;
5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA;
6. 支持通过JDBC和journal提供高速的消息持久化;
7. 从设计上保证了高性能的集群,客户端-服务器,点对点;
8. 支持Ajax;
9. 支持与Axis的整合;
10. 可以很容易得调用内嵌JMS provider,进行测试;
11. ActiveMQ速度非常快;一般要比jbossMQ快10倍。
优点:
是一个快速的开源消息组件(框架),支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,XA,和J2EE1.4容器无缝结合,并且支持轻量级容器和大多数跨语言客户端上的Java虚拟机。
消息异步接受,减少软件多系统集成的耦合度。
消息可靠接收,确保消息在中间件可靠保存,多个消息也可以组成原子事务。
缺点:
ActiveMQ默认的配置性能偏低,需要优化配置,但是配置文件复杂,ActiveMQ本身不提供管理工具;
示例代码少;主页上的文档看上去比较全面,但是缺乏一种有效的组织方式,文档只有片段,用户很难由浅入深进行了解,
文档整体的专业性太强。在研究阶段可以通过查maillist、看Javadoc、分析源代码来了解。