热门标签 | 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脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 基于Axis、XFire、CXF的webservice客户端调用示例
    本文介绍了如何使用Axis、XFire、CXF等工具来实现webservice客户端的调用,以及提供了使用Java代码进行调用的示例。示例代码中设置了服务接口类、地址,并调用了sayHello方法。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
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社区 版权所有