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

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

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

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

  上面的思路整清楚了,接下来就要详细实现。(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. springMVC中数据流解析与装载

    最近在看springmvc原理时,看到一篇比较赞的博文,留存学习,如果侵权,请告知,立删. 地址: https://my.oschina.net/lichhao/blog/172562

  2. Luogu P4204 神奇口袋 题解报告

    题目传送门 [题目大意] 一个口袋里装了t种颜色的球,第i种颜色的球的数目为a[i],每次随机抽一个小球,然后再放d个这种颜色的小球进口袋. 给出n个要求,第x个抽出的球颜色为y,求满足条件的概率. ...

  3. 【题解】狼抓兔子—BZOJ1001。

    (胡扯时间)今天炒鸡无聊就打算BZOJ开始从第一道题开始顺着打,这样未来一段时间内也就有事干了.结果发现A+B切掉后就遭遇了一个"小小"的瓶颈(真不友好. 好了说题说题.看题第一眼 ...

  4. IIS7二级域名添加同一证书

    IIS7二级域名添加同一证书, 先绑定第一个域名到443 ,之后的用以下命令行绑定 cd C:\Windows\System32\Inetsrv\appcmd set site /site.name: ...

  5. LeetCode第十八题-四数之和

    4Sum 问题简介:定n个整数和整数目标的数组nums,是否有元素a,b,c,d在nums中,使a+b+c+d=target? 举例: 给定数组 nums = [1, 0, -1, 0, -2, 2] ...

  6. echarts-饼状图默认选中高亮

    1.首页需要设置legend legend: { data: ["积极", "负面"], selectedMode: false, show: false } ...

  7. 大前端服务器渲染 发布和部署 Vue + vue(SSR)

    https://blog.csdn.net/sinat_15951543/article/details/80109521    就是到服务器dist 下面 npm run start & 然 ...

  8. django ajax 及批量插入数据 分页器

    ``` Ajax 前端朝后端发送请求都有哪些方式 a标签href GET请求 浏览器输入url GET请求 form表单 GET/POST请求 Ajax GET/POST请求 前端朝后端发送数据的编码 ...

  9. 【算法】Normalization

    Normalization(归一化) 写这一篇的原因是以前只知道一个Batch Normalization,自以为懂了.结果最近看文章,又发现一个Layer Normalization,一下就懵逼了. ...

  10. loadrunner出现中文乱码

    录制的脚本出现乱码 录制的时候出现乱码,有的时候可以正常回放,我们可以不用管它,但如果影响回放,我们可以使用以下方法解决: 1)更改录制选项 选择菜单栏 Tools --> Recording ...