热门标签 | 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对象,它能够以异步的方式响应队列或主题上到达的消息


推荐阅读
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
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社区 版权所有