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

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

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

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

  上面的思路整清楚了,接下来就要详细实现。(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. Go语言入门: Chapter1

    书籍官网: http://www.gopl.io 环境配置: https://studygolang.com/articles/8284  安装go和vscode中go的相关插件 主要命令学习: go ...

  2. BeautifulSoup爬网页图片

    #-*- coding: utf-8 -*- import urllib2 import urllib import os from BeautifulSoup import BeautifulSou ...

  3. windows service创建使用整合

    C#创建Windows Service(Windows 服务)基础教程 C#winform windows服务程序创建与安装 C#实现WinForm随WINDOWS服务一起启动

  4. 程序到CPU的路径

    汇编 源码->编译->CPU C/C++ 源码->编译->机器码->系统(执行)->CPU Java/.NET 源码->编译->J字节码->虚拟机 ...

  5. Virtualbox Ubuntu 虚拟机命令行挂载共享文件夹及设置静态IP

    挂载共享文件夹 参考 [1], VirtualBox/GuestAdditions [2], VirtualBox/SharedFolders 步骤 在Virtualbox 虚拟机的菜单『设备』中,点 ...

  6. Centos7.2下部署Java开发环境

    1.安装JDK 如果以前安装过JDK,想要重新安装可执行如下命令进行卸载,这里安装的是JDK1.8: 先查询: rpm -qa|grep jdk 然后再通过下面命令进行卸载 rpm -e --node ...

  7. python&JSONP(初级篇)

    JSONP产生背景 1.跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 2.浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互. 3.如果协议,端口和主机对 ...

  8. 使用scrapy爬虫,爬取今日头条搜索吉林疫苗新闻(scrapy+selenium+PhantomJS)

    这一阵子吉林疫苗案,备受大家关注,索性使用爬虫来爬取今日头条搜索吉林疫苗的新闻 依然使用三件套(scrapy+selenium+PhantomJS)来爬取新闻 以下是搜索页面,得到吉林疫苗的搜索信息, ...

  9. hibernate 一对多 取多方数据重复问题,FetchMode.JOIN、FetchMode.SELECT、FetchMode.SUBSELECT区别

    问题描述:稿件附件表数据时出现多条重复数据. 介绍: 表:稿件实体Manuscripts (数据库表MANUSCRIPTS),稿件附件实体ManuscriptsAtt(表MANUSCRIPTS_ATT ...

  10. react給變量賦值并列元素

    今天在使用react時發現一個問題:我在給一個變量賦值多個元素,但不能用div包含起來. 如: var p = <div> <p></p> <p>< ...