一、JMS概述

一、JMS概念

摘要:The Java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.

JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。jms是java的消息服务,JMS客户端之间可以通过JMS服务进行异步的消息传输

消息包括:消息头,消息扩展属性和消息休,其结构看起来与SOAP非常相似,但一般情况下,SOAP主要关注远程服务调用,而消息则专注于信息的交换。

消息分为:消息生产者,消息服务器和消息消费者。生产者与消费者之间是透明的,生产者在产生消息后,把消息发送到消息服务器,再由消息服务器发给消费者,因此它们构成了JMS的3点结构;
消息服务器再给消费者时,有2种模式:点到点(point to point )模式和发布/订阅(pbulish/subscribe) 模式,两种模式下面会详细介绍;

二、消息服务器

消息服务器有很多:ActiveMQ,Jboss MQ,Open MQ,RabbitMQ ,ZeroMQ等等。
本文介绍的是开源的java实现的Apache ActiveMQ,后面我们会写到如何应用它与jms结合。

看到一个对消息服务器作用的解释:

消息队列的主要作用不是通讯,主要是用于解除子系统间的耦合,所以异构系统间的通讯实际并不是ActiveMQ发挥作用的场景,那反而是RPC发挥作用的时候。
消息队列更适合于需要更大流量和并发的大型系统场景,可以将消息队列视为一个可靠的通道,主交易过程在处理时,遇到需时较多同时又已经确定了条件的处理就丢到消息队列里进行后续处理,这样可以将主交易过程划分为一个一个可以异步处理的更小的处理过程,减少了主交易流程的处理时间,可以提供更快的响应速度和并发速度。例如,象淘宝这样的处理逻辑非常多的系统,在处理付款时,就可以将通知买家和卖家、记日志甚至记帐流程都放到消息队列里处理,整个主流程能够快速处理完成,继续处理下一个买家的请求。

应用场景:
应用场景

三、消息模型

1、Point-to-Point(P2P) – 点对点模式

这里写图片描述

每条消息都从消息生产者传递到单个消息使用者。生产者将消息传递给队列,稍后将其传递给为队列注册的其中一个消费者。任何数量的生产者和消费者都可以与同一个队列进行交互,但是每个消息都被保证传递给(并且被成功消费)一个消费者,而不会再消费。如果没有消费者注册队列,它将保存它收到的消息,并最终在消费者注册时传递消息。

2、Publish/Subscribe(Pub/Sub) – 发布订阅模型

这里写图片描述

单个消息可以从生产者被传递到任何数量的消费者。生产者将消息发布到一个主题,然后将其发送给订阅了该主题的所有活动消费者。任何数量的生产者都可以将消息发布到给定主题,并且每条消息都可以传递给任意数量的订阅消费者。该模型还支持持久订阅的概念,在消息发布时,注册了主题的消费者不需要处于活动状态; 当消费者随后变得活跃时,它将收到消息。如果没有活动使用者注册主题,则该主题不会持有它收到的消息,除非它具有持久订阅的不活动消费者。

三、消息的消费

在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。
○ 同步

订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞

○ 异步

订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。

四、JMS编程模型

1、 ConnectionFactory

创建Connection对象的工厂,针对两种不同的jms消息模型,分别有QueueConnectionFactory和TopicConnectionFactory两种。可以通过JNDI来查找ConnectionFactory对象。

2、Destination

Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来说,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来说,它的Destination也是某个队列或主题(即消息来源)。

所以,Destination实际上就是两种类型的对象:Queue、Topic可以通过JNDI来查找Destination。

3、Connection

Connection表示在客户端和JMS系统之间建立的链接(对TCP/IP socket的包装)。Connection可以产生一个或多个Session。跟ConnectionFactory一样,Connection也有两种类型:QueueConnection和TopicConnection。

4、Session

Session是我们操作消息的接口。可以通过session创建生产者、消费者、消息等。Session提供了事务的功能。当我们需要使用session发送/接收多个消息时,可以将这些发送/接收动作放到一个事务中。同样,也分QueueSession和TopicSession。

5、消息的生产者

消息生产者由Session创建,并用于将消息发送到Destination。同样,消息生产者分两种类型:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或publish方法)发送消息。

6、消息消费者

消息消费者由Session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过session的createReceiver(Queue)或createSubscriber(Topic)来创建。当然,也可以session的creatDurableSubscriber方法来创建持久化的订阅者。

7、MessageListener

消息监听器。如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一种MessageListener。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值