热门标签 | 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异常处理的本质,提出了设计模式以优化异常处理,并分析了在AOP模型中异常处理的应用。文章强调了正确使用Java异常对于提升代码质量和维护性的关键作用。 ... [详细]
  • 本文深入探讨了Java注解的基本概念及其在现代Java开发中的应用。文章不仅介绍了如何创建和使用自定义注解,还详细讲解了如何利用反射机制解析注解,以及Java内建注解的使用场景。 ... [详细]
  • 本文探讨了为何采用RESTful架构及其优势,特别是在现代Web应用开发中的重要性。通过前后端分离和统一接口设计,RESTful API能够提高开发效率,支持多种客户端,并简化维护。 ... [详细]
  • 本文详细介绍了Java中`org.sakaiproject.site.api.Site.addPage()`方法的功能和使用方法,并提供了多个实际项目中的代码示例。 ... [详细]
  • Spring Boot中的API可视化工具介绍
    本文将介绍如何使用Spring Boot集成Swagger来创建和展示API文档。通过访问http://localhost:8080/swagger-ui.html,用户可以直接查看到应用的API文档界面,这一功能极大地简化了API文档的编写和维护。 ... [详细]
  • 本文探讨了缓存系统中的两个关键问题——缓存穿透与缓存失效时的雪崩效应,以及这些问题的解决方案。此外,文章还介绍了数据处理、数据库拆分策略、缓存优化、拆分策略、应用架构演进及通信协议的选择等内容。 ... [详细]
  • 本文详细探讨了在Windows Server 2003环境下遇到MySQL连接失败(错误代码10061)的解决方案,包括通过卸载特定的Windows更新和调整系统注册表设置的方法。 ... [详细]
  • 本文介绍了如何在 Linux 系统上构建网络路由器,特别关注于使用 Zebra 软件实现动态路由功能。通过具体的案例,展示了如何配置 RIP 和 OSPF 协议,以及如何利用多路由器查看工具(MRLG)监控网络状态。 ... [详细]
  • 手把手教你构建简易JSON解析器
    本文将带你深入了解JSON解析器的构建过程,通过实践掌握JSON解析的基本原理。适合所有对数据解析感兴趣的开发者。 ... [详细]
  • 本文详细探讨了 Java 中 Daemon 线程的特点及其应用场景,并深入分析了 Random 类的源代码,帮助开发者更好地理解和使用这些核心组件。 ... [详细]
  • 本章深入探讨了如何在JavaScript游戏中有效地管理和使用图像(精灵)及声音资源,包括加载、绘制和播放等关键步骤。 ... [详细]
  • 本文通过一个具体的用户管理项目,详细介绍如何使用Spring MVC框架进行开发。从用户实体类的设计到控制器的实现,再到视图层的展示,全面解析Spring MVC的核心功能与实现细节。 ... [详细]
  • 本文介绍了一种通过自定义工具类实现Spring的ApplicationContextAware接口来获取Spring容器中Bean的方法,并提供了详细的代码示例和配置说明。 ... [详细]
  • JavaScript 实现购物商城商品图片放大功能
    本文介绍了如何使用 JavaScript 和 CSS 实现购物商城中商品图片的放大功能,解决了图片放大时文字位置变化的问题,并提供了详细的代码示例。 ... [详细]
  • 深入浅出:Java面向对象编程
    本文详细介绍了Java语言的核心特性——面向对象编程。探讨了Java的基本概念、平台无关性、丰富的内置类库及安全性,同时深入解析了类加载器、垃圾回收机制以及基本数据类型和其包装类。 ... [详细]
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社区 版权所有