在我们的日常开发中,经常会遇到这样的问题--"我让你做一件事情,但是你做得很慢,并不能够立马返回给我结果,害我一直在那儿等着你给我返回结果,什么都做不了"。

  程序是自上而下顺序执行的,很多时候后一步的操作依赖于前一步操作的返回结果,所以必须按照顺序依次执行;如果我不想等,那我就需要把操作拆分解耦,解耦我可以做到,就是让后面的操作不一定非要等到前面操作的完成,不是非要依赖于前面的返回结果,也就是我不用等你了。我们可以把耗时的操作,对整体结构非关键部分的操作异步执行。

  可是异步执行完,你要通知我,对我说你帮我做好了啊。因为,事情做好了,不管什么结果,我还要接着处理一下啊,不是说异步我丢给你了我就不管了,我只是暂时没空等你,我希望你在背后帮我完成,做好了你还是要跟我说的,然后我仍需要继续处理的。可是问题是,你做好了怎么通知我呢?并且到时候你还在不在我都不知道,我收到你的通知怎么告诉你?

  问题出来了,那么肯定要想办法解决啊。首先要解决的就是--"你异步处理完,怎么通知我?",要解决这个问题很简单--在我让你异步处理的时候,告诉你一个地址,你处理完后就可以通过这个地址找到我,告诉我你的处理结果。然后问题又来了,你完成后,通过地址通知我,可是不知道我是否接收到,你就会一直通知我。这个问题就更加简单了,我们约定一个字段,我给你返回特定字段,也就是告诉你我收到通知了,你就不要在通知我了。

  上面的思路整清楚了,接下来就要详细实现。(Java实现)

  比如现在我要买一张火车票,我们选择银联支付,支付完成后,我们会收到购票通知,也会收到银联给我们返回的扣款通知。这里面就用到了异步通知,在下单的时候,服务端请求银联的扣款接口,同时在接口告诉银联处理后返回结果通知地址,服务端收到银联的通知后,根据返回的支付结果判断是否出票。

  在这个购票过程中,我们需要注意的是--目前主流的服务端框架都是Spring cloud,我们告诉第三方的异步通知地址(其实就是我们的接口请求路径),第三方处理结果通知到我们服务端,这个过程和客户端请求接口是很像的。当时目前的框架中都会又一个gateway(网关),在网关内,我们都会进行验签、路由等操作,而客户端和服务端进行交互的时候我们都会约定好验签、路由相关的数据或配置,当时和第三方对接时,我们是不可能将这些东西告诉他们的。

  所以,在接收第三方异步通知的时候,我们需要考虑的首要事情就是--第三方处理的结果如何成功的通知到我们服务端内部。本地开发时可以按照我的上一篇文章《Mac配置内网穿透》配置本地ip的外网映射。正常的生产开发过程其实还涉及到另外一点--异步通知只能通知到外网地址,需要经过nginx转发后到我们的程序中,因此还需要在服务器上配置nginx,使得通知能够通过外网到我们内网服务器地址上(以后会介绍这一块内容的)。

  处理结果的通知顺利进入我们程序后,我们还需要根据其返回的格式做处理,目前我对接的第三方异步通知返回的结果各种各样--JsonObject ,HttpServletRequest...,我们需要根据返回的数据格式合理的选择接收对象,当然,如果觉得麻烦,也可以自定义注解,然后将返回格式统一成自己喜欢的格式。个人比较喜欢使用HttpServletRequest接收,处理起来方便一点。最后,我们接收到通知之后,需要按照约定,返回第三方所需的字段,自此,整个异步通知过程就结束了。

  但是,对于我们服务端而言,返回信息的处理才刚开始,我们需要对异步通知的内容进行验签、解密等操作,确认我们接收到的数据是合法、正确的。

  

  

Java中的异步通知的更多相关文章

  1. 第三十四篇:在SOUI中使用异步通知

    概述 异步通知是客户端开发中常见的需求,比如在一个网络处理线程中要通知UI线程更新等等. 通常在Windows编程中,为了方便,我们一般会向UI线程的窗口句柄Post/Send一个窗口消息从而达到将非 ...

  2. Linux设备驱动中的异步通知与异步I/O

    异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...

  3. java中的异步处理和Feature接口(一)

    背景介绍想象这样一个场景:你可能希望为你的法国客户提供指定主题的热点报道.为实现这一功能,你需要向 谷歌或者Twitter的API请求所有语言中针对该主题最热门的评论,可能还需要依据你的内部算法 对它 ...

  4. java 中的异步回调

    异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...

  5. java中同步异步阻塞和非阻塞的区别

    同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等).但是一般而言,我们在说同步.异步的时候,特 ...

  6. Linux学习 :按键信号 之 异步通知

    一.异步通知概念: 异步通知是指:一旦设备就绪,则主动通知应用程序,应用程序根本就不需要查询设备状态,类似于中断的概念,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进 ...

  7. linux设备驱动归纳总结(三):7.异步通知fasync【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-62725.html linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxx ...

  8. 蜕变成蝶~Linux设备驱动之异步通知和异步I/O

    在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代.异步通知类 ...

  9. 【Linux开发】linux设备驱动归纳总结(三):7.异步通知fasync

    linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

随机推荐

  1. 树莓派3B+ 安装系统

    安装概要步骤: 官网下载系统->刷入TF卡->设置开启显示器和SSH->通电->进入系统 1. 进入官方网站下载系统镜像 下载页面:https://www.raspberryp ...

  2. 题解 P4753 【River Jumping】

    这道神奇的模拟题,带一点贪心,其实蛮水的,仔细思考就能ac. 首先我们模拟一下样例2 发现其实答案0 1 2 3也可以,仔细观察题目,我们发现了一句有意思的话:允许输出任意一组答案. 所以就可使用xj ...

  3. PHP程序运行性能分析

    php在使用了xdebug后,可以配置xdebug相关的配置,生成运行的日志. 在php.ini中配置: xdebug.profiler_enable = 1 xdebug.profiler_enab ...

  4. 最小生成树--克鲁斯卡尔算法(Kruskal)

    按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...

  5. L2-004 这是二叉搜索树吗? (25 分) (树)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 题目: 一棵二叉搜索树可被递归地定义为 ...

  6. Django-F,Q查询,Templatetags,session,中间件

    内容总览1.ORM的多对多的使用 1>语法与实例   2>聚合与分组   3>F与Q查询   4>事务2.模板之自定义 1>初始化 2>filter 3>si ...

  7. [Linux]不可重入函数

    一.概述 怎么会有可重入和不可重入. 在多任务系统下,中断可能在任务执行的任何时间发生:如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是 ...

  8. 实验1:C++简单程序设计(1)

    实验目的 1. 掌握c++中类c部分的编程知识: 数据类型,常量,变量,运算符,表达式,分支结构,循环结构 2. 掌握C++中数据输入和输出的基本方法 3. 熟练使用c++程序开发环境,掌握c++程序 ...

  9. mathJax基础语法-0基础开始,(这是网上抄来的如果有权限和版权问题联系本人处理,仅供学术参考)

  10. oracle Data Modeler 使用教程

    由于 powerdesigner 的版权问题.公司要求集体换成 oracle Data Modeler .免费版就够用,哈哈.这有很详细的入门教程,看一看吧: 官方正版教程 ,特详细,只是英文的,也只 ...