【EJB系列】(三)——JMS和MDB

概念

JMS

Java Message Service

JMS即Java消息服务,是java平台上有关面向消息中间件的技术规范,是JavaEE十三个规范之一。

面向消息

之前,不同组件之间通信是通过:

一个组件调用另一个组件的方法。
这种调用,有直接调用,也有像EJB的SessionBean中的远程方式调用或以WebService方式调用。
弊端:通信方式必须是同步的(即调用者调用方法成功之后,才能再执行接下来的代码);两个组件是耦合在一起的。

面向消息的通信:

一个组件把消息发送到目的地,另一个组件监听目的地,待消息到达后,获取消息,执行方法。
优点:通信方式可以是同步,也可以是异步,比较灵活;两个组件不用耦合在一起,解耦合

两种消息模型

      这里写图片描述

PTP

点对点消息类型:消息发送给一个单独的使用者。

消息队列(Queue)、发送者(Sender)、接收者(Receiver)。

  • 每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。
  • 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
  • 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列。
  • 如果消费者暂时不在,消息服务器会将消息保存到永久介质上。
  • 接收者在成功接收消息之后需向队列应答成功。

如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模型

Pub/Sub

发布/订阅消息类型:支持一个事件驱动模型,生产者和消费者都残余消息的传递。

主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。

  • 客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
  • 每个消息可以有多个消费者
  • 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅之后,才能消费发布者的消息,而且,为了消费消息,订阅者必须保持运行的状态。
  • 当然,为了缓和这种严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

如果你希望发送的消息可以不被做任何处理、或者被一个消费者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型。

比较方面PTPPub/Sub
消息的消费者个数11或多
消费者是否运行对消息消费的影响不管是否运行,消息会发送到队列,甚至被保存到数据库或文件中不运行就消费不了消息,但是允许一个持久化的订阅,没运行也能接收
是否需要应答需要不需要

消息的消费

同步 – 订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞。
异步 – 订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。而MDB就是这里的消息监听者。 

MDB

组件将消息发送到指定消息目的地,而MDB负责监听此消息目的地,当该消息到达时,由容器负责调用MDB,接收并处理消息。

技术前瞻

消息中间件有很多。
阿里的Notify
分布式发布订阅消息系统: Kafka
分布式消息中间件 Metamorphosis(MetaQ)
……
想了解更多,点击这里

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值