Java JMS——消息服务

 

转载请注明原文地址: https://www.cnblogs.com/ygj0930/p/10921569.html

 

一:什么是Java消息服务—— 消息通信接口规范

  Java消息服务指的:两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等。

 

二:为什么要用JMS

  当大并发时,业务逻辑无法同时处理这么多同时发生的请求,但是客户端又不可能一直阻塞等待后台处理完。因此就需要将 请求的送达 与 业务逻辑处理 解耦,“延时处理”

  举个例子:

  电商平台搞秒杀活动时,大家都争先恐后地去抢同一件商品,其过程是:用户发送购买请求后,服务器接到请求,向消息队列发送一个购买消息并立刻返回“订单正在处理”的结果给客户避免客户等待。

  而订单服务[处理订单的业务逻辑]则不停的从消息队列中取出消息,按照自己的节奏去处理订单,并将结果返回对应客户端。

 

  这样做可以有效避免高并发时造成业务系统瘫痪的情况。

 

三:JMS的使用场景

  JMS一般适用于Web场景下的高并发处理。

  而对于ToB场景下,如企业ERP系统,则基本不会用到。

  因为ToC业务链条简单,业务结果可以允许轻微的延迟送达,不影响用户的最终结果。

  而企业系统流程长,环环相扣,每个环节都必须执行完才能走下一步业务,这种情况下消息队列的使用反而会造成业务混乱。

 

四:JMS的优势

  1、异步处理

  2、可靠传递:JMS保证消息只会递送一次。

 

五:JMS消息传送模型

 1、点对点传输模型——适合于只有一个业务处理程序的场景

  

  此模型由:消息发送者、消息队列、消息接收者[处理者] 组成。

  • 每个消息只有一个接收者;
  • 消息发送者和接收者并没有时间依赖性,互不可见。
  • 当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息;
  • 当接收者收到消息的时候,会发送确认收到通知(acknowledgement)。

     

  2、发布订阅 模型

  

  此模型由 消息发送者、主题、多个订阅者 组成。

  topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

  • 一个消息可以传递给多个订阅者
  • 发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息。
  • 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

 

六:JMS消息接收方式

  1、同步接收

  消息订阅者调用receive()方法。在receive()中,消息未到达或在到达指定时间之前,该方法会一直阻塞,直到有消息到来。

 

  2、异步接收

  消息订阅者需注册一个消息监听者,类似于事件监听器,只要消息到达,JMS服务提供者会通过调用监听器的onMessage()来处理消息。

 

七:JMS编程接口组成

  JMS提供了一系列消息服务的处理规范,由以下6部分组成:

  1. 连接工厂(Connection Factories)和目的地(Destination)
  2. 连接(Connections)
  3. 会话(Sessions)
  4. 消息生产者(Message Producers)
  5. 消息消费者(Message Consumers)
  6. 消息监听者(Message Listeners)

 

八:JMS的消息组成

   JMS消息由三部分组成:

  1、消息头——用于匹配

  JMS消息头预定义了若干字段用于客户端与JMS提供者之间识别和发送消息,预编译头如下:

  – JMSDestination
  – JMSDeliveryMode
  – JMSMessageID
  – JMSTimestamp
  – JMSCorrelationID
  – JMSReplyTo
  – JMSRedelivered
  – JMSType
  – JMSExpiration
  – JMSPriority

  2、消息属性

  我们可以给消息设置自定义属性,这些属性主要是提供给应用程序的。对于实现消息过滤功能,消息属性非常有用,JMS API定义了一些标准属性,JMS服务提供者可以选择性的提供部分标准属性。

  3、消息体

  JMS API定义了五种类型的消息格式

  Text message : javax.jms.TextMessage,表示一个文本对象。
  Object message : javax.jms.ObjectMessage,表示一个JAVA对象。
  Bytes message : javax.jms.BytesMessage,表示字节数据。
  Stream message :javax.jms.StreamMessage,表示java原始值数据流。
  Map message : javax.jms.MapMessage,表示键值对。

 

九:JMS的实现——ActiveMQ

  上面JMS的两种模型中提到,消息服务的场景主要包括:生产者、消费者、消息队列、主题。

  其中,消息生产者 和 消息消费者 分别是两个微服务,一个负责接收请求生成消息,另一个负责提取消息进行业务处理。

  而中间作为消息容器的 队列、主题,则是由JMS的实现厂商提供的软件实现,例如:ActiveMQ。

  Activemq是一个软件,一个消息服务器。我们的程序作为生产者和消费者,当ActiveMQ启动起来,并配着好host以及相关协议后,即可在我们的程序中,连接到该台服务器,创建连接并发送/获取消息了。

 

十:JMS编程步骤

  发送消息:

  (1)、创建连接使用的工厂类JMS ConnectionFactory 
  (2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动 
  (3)、使用连接Connection 建立会话Session 
  (4)、使用会话Session和管理对象Destination创建消息生产者MessageSender 
  (5)、使用消息生产者MessageSender发送消息

 

  接受消息:
  (1)、创建连接使用的工厂类JMS ConnectionFactory 
  (2)、使用管理对象JMS ConnectionFactory建立连接Connection,并启动 
  (3)、使用连接Connection 建立会话Session 
  (4)、使用会话Session和管理对象Destination创建消息接收者MessageReceiver 
  (5)、使用消息接收者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver消息接收者必须实现了MessageListener接口,需要定义onMessage事件方法。

  

  

 

十一:实战例子

  JMS点对点消息传送实现参考:https://www.cnblogs.com/chenpi/p/5565618.html

  JMS发布/订阅模型实现参考:https://www.cnblogs.com/chenpi/p/5566983.html

 

  点对点传送 与 发布/订阅模式 的实现区别:

  点对点通过session创建队列,而发布/订阅模式创建主题。

 

转载于:https://www.cnblogs.com/ygj0930/p/10921569.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Classes contained in javax.jms.jar: javax.transaction.xa.XAResource.class javax.jms.BytesMessage.class javax.jms.Message.class javax.jms.JMSException.class javax.jms.Destination.class javax.jms.DeliveryMode.class javax.jms.Connection.class javax.jms.Session.class javax.jms.ConnectionMetaData.class javax.jms.ExceptionListener.class javax.jms.ServerSessionPool.class javax.jms.ConnectionConsumer.class javax.jms.Topic.class javax.jms.MapMessage.class javax.jms.ObjectMessage.class javax.jms.StreamMessage.class javax.jms.TextMessage.class javax.jms.MessageListener.class javax.jms.MessageProducer.class javax.jms.MessageConsumer.class javax.jms.Queue.class javax.jms.TopicSubscriber.class javax.jms.QueueBrowser.class javax.jms.TemporaryQueue.class javax.jms.TemporaryTopic.class javax.jms.ServerSession.class javax.jms.ConnectionFactory.class javax.jms.MessageNotReadableException.class javax.jms.MessageNotWriteableException.class javax.jms.QueueConnection.class javax.jms.QueueSession.class javax.jms.QueueReceiver.class javax.jms.QueueSender.class javax.jms.QueueConnectionFactory.class javax.jms.QueueRequestor.class javax.jms.TopicConnection.class javax.jms.TopicSession.class javax.jms.TopicPublisher.class javax.jms.TopicConnectionFactory.class javax.jms.TopicRequestor.class javax.jms.XAConnection.class javax.jms.XASession.class javax.jms.XAConnectionFactory.class javax.jms.XAQueueConnection.class javax.jms.XAQueueSession.class javax.jms.XAQueueConnectionFactory.class javax.jms.XATopicConnection.class javax.jms.XATopicSession.class javax.jms.XATopicConnectionFactory.class javax.jms.MessageEOFException.class javax.jms.TransactionRolledBackException.class javax.jms.MessageFormatException.class javax.jms.IllegalStateException.class javax.jms.JMSSecurityException.class javax.jms.ResourceAllocationException.class javax.jms.TransactionInProgressException.class javax.jms.InvalidDestinationException.class javax.jms.InvalidClientIDException.class javax.jms.InvalidSelectorException.class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值