jms domains: 消息传递域
-
点对点(queue)
特点:
- 每个消息只能别消费一次
- 生产者和消费者没有时间上的相关性
-
发布/订阅(topic)
特点:
- 每个消息可以有多个消费者
- 生产者和消费者有时间上的相关性,消费者只能消费自他订阅之后发布的消息。持久订阅允许消费者消费他在未处于激活状态时发送的消息;
JMS的消息结构
消息的机构体
JMS的可靠性
-
事务性会话中,当一个事务被提交的时候,确认自动发生。
-
非事务绘画中,消息何时被确认取决于会话时的应答模式(acknowledgement mode)。
该参数有三个可选值:
- Session.AUTO_ACKNOWLEDGE, 从receive方法返回或者从MessageListener.onMessage方法成功返回的时候,自动确认。
- Session.CLIENT_ACKNOWLEDGE,客户通过调用消息的acknowledge方法确认消息,注意:这种模式中,确认是会话层中进行的,确认一个被消费的消息将自动确认所有已被会话消费的消息。
- Session.DUPS_ACKNOWLEDGE,该选择只是会话迟钝的确认消息的提交。如果JMS provider失败,那么会导致一些重复的消息。如果重复,那么JMS provider 必须把消息头的JMSRedelivered字段设置为true.
-
持久订阅
消息生产者必须使用PERSISTENT提交消息。客户可以通过会话上createDurableSubscriber方法来创建一个持久订阅,该方法的第一个参数必须是topic。第二个参数是订阅的名称。
-
本地事务,使用本地事务来组合消息的发送和接受。jms session 接口提供了commit和rollback方法。
注意 如果使用请求/回复机制,即发送一个消息,同事希望在同一个事务中等待接受消息的回复,那么程序将被挂起,因为直到事务提交,发送操作才会真正执行。
JMS的PTP模型
特点:
- 如果在session关闭时,消息收到但没有被签收(acknowledge),当消费者下次链接到相同的队列时,这些消息还会被接受
- 如果用户在receive方法中设定了消息选择条件,不符合的消息会留在队列中,不会被收到
- 队列可以长久的保存消息直到消费者收到消息。不会丢失,充分体现了异步传输模式的优势。
JMS的Pub/Sub模型
特点:
- 消息订阅分持久订阅和非持久订阅,非持久订阅离线时,不会收到这个时间段的主题消息
- 如果用户在receive方法中设定了消息选择条件,不符合的消息会留在队列中,不会被收到
- 非持久订阅下,不能恢复和重新派送一个未签收的消息,只有持久订阅才能恢复和重新派送一个未签收的消息
- 当所有的消息必须被接受,则用持久订阅。当丢失消息能够被容忍,则用非持久订阅
持久的Topic消息
- 需要在连接上设置消费者id,用来识别消费者
- 需要创建TopicSubscriber来订阅
- 要设置好了在start这个connection
- 一定要先运行一次,等于向消息服务中间件注册这个消费者,然后再发送消息
Broker:相当于一个ActiveMQ服务器实例
嵌入式启动broker