首页 > 代码库 > JMS两种消息模型

JMS两种消息模型

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

个人觉得这两个模型挺容易理解的,因为生活中的例子还挺多的。

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)。客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

(1) 每个消息可以有多个消费者

(2) 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅之后,才能消费发布者的消息,而且,为了消费消息,订阅者必须保持运行的状态。

    为了缓和这种严格的时间上的依赖性,JMS允许订阅者创建一个可持久化的订阅(即,发送者和接收者之间在时间上没有依赖性。这样的话,即使订阅者没有运行,它也能接收到发布者的消息。)

    如果希望发送的消息可以被一个/多个消费者消费,那么可以采用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模型可以有多个消费者 。