点对点消息传送模型以向一个指定的目的地发送一条消息的概念为基础。该目的地的真实网络位置对发送者来说是透明的,因为P2P客户端工作时使用的是从JNDI命名空间获得的一个Queue标识符。
使用P2P消息传送模型,P2P接收者能够推送或拉取消息,这取决于它是否使用异步onMessage()回调或同步receive()方法。
在P2P模型中,多个消费者可以使用同一队列,但是传送给该队列的每条消息只能由其中一个消费者来接收。发送给一个队列的消息究竟如何发布给该队列中的消费者,这要取决于JMS提供者的策略。一些JMS提供者会使用负载均衡技术在消费者中均匀发布消息,而其他JMS提供者则可能会使用更为随意的策略。
供P2P队列使用的消息,既可以是持久性的,也可以是非持久性的。持久性消息会在JMS提供者出现故障后继续存在,而非持久性消息则恰恰相反。消息还可以有一个优先级和一个有效期。点对点消息传送模型和发布/订阅消息传送模型之间的一个重要区别就是:P2P消息会被一直传送,它不会考虑接收者当前的连接状态。一旦某条消息被传送给一个队列,它就会保存在该队列中,即使当前并没有消费者连接。
点对点模型API:
- QueueConnectionFactory
- Queue
- QueueConnection
- QueueSession
- QueueSender
- QueueReceiver
点对点消息传送模型有两种类型:异步即发即弃处理和异步请求/应答处理。
消息关联:用于确保接收正确消息的一项技术。最常用的消息关联方法是将JMSCorrelationID消息头属性和JMSMessageID消息头属性结合在一起使用。JMSCorrelationID属性包含了一个发送者和接收者都知道的唯一String值。我们通常会用JMSMessageID,因为它是唯一的,而且对发送者和接收者来说都可用。
尽管通常使用JMSMessageID来标识特定信息,但这不是一种硬性要求。您可以使用能将请求和应答消息关联起来的任何手段。例如可以使用Java的UUID类来生成一个唯一的ID。
动态队列对受管队列:
动态队列是通过使用厂商特定API的应用程序源代码创建的队列。受管队列则是在JMS提供者配置文件或管理工具中定义的队列。
使用多个接收者实现负载均衡:
分析一个队列: