目录

JAVA消息系列—JMS

前言

基本概念

消息模型

P2P模式

Pub/Sub模式

消息的消费

JMS编程模型


JAVA消息系列—JMS

前言

java 消息模块个人理解分为两种:

同步消息(RPC调用)

异步消息(本篇讲解部分)

  • 同步消息java提供了多种方案:

新比较常用的方式就是spring Http invoker(注:只在spring项目)和服务提供JAX-WS方式

  • 本文主要内容:异步消息

异步消息首先分两处讲解:

1.JMS(Java Message Service)

2.AMQP(Advanced Message Queuing Protocol)

不同于同步消息,什么是异步消息。

客户端主服务不需要等待服务处理消息,简单来说就是不阻塞。(单纯这样通过多线程RPC访问也能达到同样效果)

在异步消息中有两个主要概念:

消息代理(message broker)

目的地(destination)

注意:不同的消息系统会提供不同的消息路由模式,但是有两种通用的的目的地:

1. 队列(queue)      2.主题(topic)

基本概念

JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。J2EE中的一个重要规范。

消息模型

  1. 点对点模式Point-to-Point(P2P)
  2. 发布/订阅模式Publish/Subscribe(Pub/Sub)

P2P模式

1、P2P模式图 

2、涉及到的概念

消息队列(Queue)

发送者(Sender)

接收者(Receiver)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。

3、当前模式需要了解的点:

1.一个生产者之对应一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

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

3.消费者从队列获取消息,接收者在成功接收消息之后需向队列应答成功,即队列中的消息只有在被消费或者超时才会被销毁(所以消费者可以不用时时监听)

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

Pub/Sub模式

1、Pub/Sub模式图 

2、涉及到的概念

主题(Topic)(模版队列+动态队列)

发布者(Publisher)

订阅者(Subscriber)

客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

3、当前模式需要了解的点:

1.一个生产者之对应多个个消费者,即一条消息可以被多次消费。

2.默认情况下,当生产者生产消息的时候,消费者必须在线同事消费,即发布主题时,订阅者必须在线监听

3.为了解除订阅模式,消费者与主题的时间耦合,JMS提供可持久化订阅,这块是重点,即针对于某些特定的订阅者,Topic会缓存至其订阅者消费或消息超时。

如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用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。

JAVA消息系列:JMS详解相关推荐

  1. Java消息服务JMS详解

    2019独角兽企业重金招聘Python工程师标准>>> JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业 ...

  2. ActiveMQ学习总结(5)——Java消息服务JMS详解

    JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互. JMS的编程过程很简单,概 ...

  3. java jms 消息服务_Java消息服务JMS详解

    Java消息服务(JMS Java Message Services)提供了点对点模式(Point-to-Point Queue)和发布-订阅模式(Publish-Subscribe Topics). ...

  4. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  5. 消息队列超详解(以RabbitMQ和Kafka为例,为何使用消息队列、优缺点、高可用性、问题解决)

    消息队列超详解(以RabbitMQ和Kafka为例) 为什么要用消息队列这个东西? 先说一下消息队列的常见使用场景吧,其实场景有很多,但是比较核心的有3个:解耦.异步.削峰. 解耦:现场画个图来说明一 ...

  6. java 8 stream reduce详解和误区

    文章目录 简介 reduce详解 总结 java 8 stream reduce详解和误区 简介 Stream API提供了一些预定义的reduce操作,比如count(), max(), min() ...

  7. 大型企业网络配置系列课程详解(四) --HSRP和VRRP配置与相关概念的理解(一)...

    大型企业网络配置系列课程详解(四)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&qu ...

  8. Windows 网络服务架构系列课程详解(一) ----DHCP服务器的搭建与配置

    Windows 网络服务架构系列课程详解(一) ---------DHCP服务器的搭建与配置   实验背景: 企业网络环境中在没有配置DHCP服务器时,经常会遇到这样的情况,用户不懂怎么去配置IP地址 ...

  9. 《网络架构系列2-Http详解》

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-[https://blog.csdn.net/cjm2484836553/article/details/104136511] <网 ...

最新文章

  1. JEECG支付宝服务窗开发培训视频
  2. 机器学习理论与实战(十四)概率图模型02
  3. 【数据竞赛】消费金融场景下的用户购买预测冠军方案分享
  4. 【Android Studio】分类整理res/Layouts中的布局文件(创建子目录)
  5. Flutter 底部弹框 showModalBottomSheet 使用Demo
  6. heapdump分析工具_.NET Perfview 分析进程性能
  7. QTeewidget逐行进行遍历(递归)
  8. USB转TTL(CH340)模块使用
  9. 读《About Face 4 交互设计精髓》4
  10. C#实现海康人脸门禁主机远程开关门和下发用户数据
  11. 什么是DNS云解析?云解析有哪些特点?
  12. 智能汽车域控制器的认识
  13. 理解inux 下 intel处理器睿频
  14. 听课记录(09/22)
  15. SPOJ Query on a tree 树链剖分 边修改
  16. 东南大学自然辩证法概论期末总结
  17. 图书管理系统的设计与实现-毕业设计(论文)开题报告
  18. VMware vSphere ESXi 6.7/7.0 定制安装盘(驱动或者SLIC)
  19. 文献综述写作指导(1)——研究方向的确定与领域内研究点的梳理
  20. java 适配器模式示例

热门文章

  1. 关于SearchView的一些小细节
  2. 华为手机滑动速度设置_用华为手机的人,这个设置赶紧关了!速度流畅告别卡顿...
  3. [dpdk] SDK编译配置
  4. 35BYJ46步进电机
  5. 深入JVM-垃圾回收
  6. APICloud 多端开发 | 拼团商城项目开发难点
  7. 如何入侵Cisco路由器
  8. 【2019正睿金华集训】0803总结
  9. 定时开关机实现原理-Android4.4/6.0
  10. 三相PFC程序30KW充电桩 采用目前最常用的TI DSP数字信号处理芯片