热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring消息简介

像RMI、Hessian、Burlap、HTTPinvoker和Web这些服务,在应用程序之间进行通信的机制都是同步的,客户端应用程序直接与远程服务相交

       像RMIHessianBurlapHTTP invokerWeb这些服务,在应用程序之间进行通信机制都是同步的,客户端应用程序直接与远程服务交互,并且一直等到远程过程完成后才能继续执行同步通信有它自己适应的场景。

       这种通信方式(同步)不是应用程序之间进行交互的唯一方式,异步消息是一个应用程序向另一个应用程序间接发送消息的一种方式,这种方式无需等待对方的响应

       若远程调用机制为同步的,当客户端调用远程方法时,客户端必须等到远程方法完成后,才能继续执行。即远程方法不向客户端返回任何信息,客户端也要被阻塞直到服务完成

       若远程调用机制为异步的,客户端不需要等待服务处理消息,甚至不需要等待消息投递完成。客户端发送消息,然后继续执行,这是因为客户端假定服务最终可以收到并处理这条信息

1、异步消息简介

       在异步消息中有两个主要的概念:消息代理(message broker)和目的地(destination)。当一个应用发送消息时,会将消息交给一个消息代理消息代理类似于一个邮局消息代理可以确保消息被投递到指定的目的地,同时解放发送者,使其能够继续进行其他的业务。

       当我们通过邮局邮递信件时,最重要的是写上地址,这样邮局就可以知道这封信应该被投递到哪里。与此类似,每条异步信息都带有一个目的地,目的地就好像一个邮箱,可以将消息放入这个邮箱,直到有人将他们取走。

       但是,并不像信件地址那样必须标识特定的收件人或街道地址,消息的目的地相对来说并不那么具体。目的地只关注消息应该从哪里获得----而不关心是由谁取走消息的。这种情况下,目的地就如同信件的地址为“本地居民”。

       尽管不同的消息系统会提供不同的消息路由模式,但是有两种通用的目的地:队列(queue)和主题(topic)。每种主题都与特定的消息模型相关联,分别是点对点模型(队列)发布/订阅模型(主题)

点对点消息模型

       点对点模型中,每一条消息都有一个发送者和接收者,如图所示。当消息代理得到消息时,他将消息放入一个队列中。当接收者请求队列中的下一条消息时,消息会从队列中取出,并投递给接收者。因为该消息被投递后会从队列中删除,这样就可以保证消息只能投递给一个接受者

       尽管消息队列中的每一条消息只被投递给一个接收者,但是它并不意味着只能使用一个接收者从队列中获取消息。事实上,通常可以使用几个接收者来处理队列中的消息。不过,每个接收者都会处理自己所接收到的消息

       如果有多个接收者监听队列,我们也无法知道某条特定的消息会由哪一个接收者处理。这种不确定性实际上有很多好处,因为我们只需要简单地为队列添加新的监听器就能提高应用的消息处理能力

发布----订阅消息模型

       在发布----订阅消息模型中,消息会发送给一个主题。与队列相似,多个接收者都可以监听一个主题。但是,与队列不同的是,消息不再是只传递给一个接收者,而是主题的所有订阅者都会接收到此消息的副本,如图所示:

2、评估异步消息的优点

       无需等待:当使用JMS发送消息时,客户端不必等待消息被处理,甚至被投递。客户端只需要将消息发送给消息代理,就可以确信消息被投递给相应的目的地。

       面向消息和解耦:发送异步信息是以数据为中心的,这就意味着客户端并没有与特定的方法签名绑定。任何可以处理数据的队列或主题订阅者都可以处理由客户端发送的信息,而客户端不必了解远程服务的任何规范。

       位置独立:消息客户端不必知道谁会处理它们的消息,或者服务的位置在哪。客户端只需要了解需要通过那个队列或主题来发送消息。因此,只要服务能够从队列或主题中获取消息即可,消息客户端根本不需要关注服务来自哪里。

       确保投递:为了使客户端可以与同步服务通信,服务必须监听指定的IP地址和端口号。如果服务崩了,或者由于某种原因无法使用了,客户端将不再继续处理。但是,当发送异步消息时,客户端可以完全相信信息被投递,即使在消息发送时,服务无法使用,消息也会被存储起来,直到服务重新可以使用为止。

3、使用JMS发送消息

       Java消息服务(Java Message Service)是一个Java标准,定义了使用消息代理的通用API。在JMS出现之前,每个消息代理都有私有的API,这就使得不同代理之间的消息代码很难通用。

       Spring通过基于模板的抽象为JMS功能提供了支持,这个模板就是JmsTemplate。使用JmsTemplate,能够非常容易地在消息生产方发送队列主题消息,在消费消息的那一方,也能够非常容易地接收这些消息。Spring还提供了了消息驱动POJO的理念:这是 一个简单的Java对象,它能够以异步的方式响应队列或主题上到达的消息


推荐阅读
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
author-avatar
gggs520_164
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有