前段时间学习EJB。接触到了JMS(Java消息服务),JMS支持两种消息模型:Point-to-Point(P2P)和Publish/Subscribe(Pub/Sub),即点对点和公布订阅模型。

个人认为这两个模型挺easy理解的,由于生活中的样例还挺多的。

1,  P2P模型

有下面概念:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每一个消息都被发送到一个特定的队列,接收者从队列获取消息。队列保留着消息,直到它们被消费或超时。

(1) 每一个消息仅仅有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

(2) 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后。无论接收者有没有正在执行,它不会影响到消息被发送到队列。

(3) 接收者在成功接受消息之后须要向队列应答成功

注:假设希望发送的每一个消息都被成功处理。或被特定的消费者消费,那么须要採用P2P模型。

使用场合:想让接收者进行且仅仅进行一次处理,组件之间进行同步通信。

个人理解:这样的模型的应用非经常见,比如:qq/微信/飞信聊天(私聊)。(1)小A和小B互加qq好友,小A给小B发一条消息”你干嘛呢?”,这条消息仅仅有小B能接收到。别人接收不到——每一个消息仅仅有一个消费者;(2)假设小B没有登录qq。也没关系。当小B登录qq后,就会看到这条消息——发送者和接收者之间在时间上没有依赖性,也就是说,当发送者发送了消息之后。无论接收者有没有正在执行,它不会影响到消息被发送到队列;

2。Pub/Sub模型

 有下面概念:主题(Topic)、公布者(Publisher)、订阅者(Subscriber)。

client将消息发送到主题。

多个公布者将消息发送到Topic。系统将这些消息传递给多个订阅者。

(1) 每一个消息能够有多个消费者

(2) 公布者和订阅者之间有时间上的依赖性。

针对某个主题(Topic)的订阅者,它必须创建一个订阅之后,才干消费公布者的消息,并且,为了消费消息,订阅者必须保持执行的状态。

同意订阅者创建一个可持久化的订阅(即,发送者和接收者之间在时间上没有依赖性。

这种话,即使订阅者没有执行,它也能接收到公布者的消息。)

    假设希望发送的消息能够被一个/多个消费者消费,那么能够採用Pub/Sub模型。

个人理解:这种模型的应用也非经常见。比如,假设qq群聊天是这种:小A、小B、小C都是”聊天群”中的成员,小A、小B在线。小C不在线,小A公布一条消息”明天放假”,那么仅仅有小B能接收到,当小C上线后也接收不到。

这样是不是非常不合理——公布者和订阅者之间有时间上的依赖性;因此,为了缓和这种严格的时间上的依赖性,JMS同意订阅者创建一个可持久化的订阅(即,发送者和接收者之间在时间上没有依赖性。这种话。即使订阅者没有执行,它也能接收到公布者的消息。

)——还是上面的样例。小A、小B、小C都是”聊天群”中的成员,小A、小B在线,小C不在线,小A公布一条消息”明天放假”。小B能够接收到。当小C上线后也能够接收到。

以上仅仅是眼下的个人理解,可能与实际有所偏差。

3,总结:

P2P模型与Pub/Sub模型的根本差别:对于p2p模型的每一个消息仅仅能有一个消费者 ; pub/sub模型能够有多个消费者 。