Java中的异步通知
在我们的日常开发中,经常会遇到这样的问题--"我让你做一件事情,但是你做得很慢,并不能够立马返回给我结果,害我一直在那儿等着你给我返回结果,什么都做不了"。
程序是自上而下顺序执行的,很多时候后一步的操作依赖于前一步操作的返回结果,所以必须按照顺序依次执行;如果我不想等,那我就需要把操作拆分解耦,解耦我可以做到,就是让后面的操作不一定非要等到前面操作的完成,不是非要依赖于前面的返回结果,也就是我不用等你了。我们可以把耗时的操作,对整体结构非关键部分的操作异步执行。
可是异步执行完,你要通知我,对我说你帮我做好了啊。因为,事情做好了,不管什么结果,我还要接着处理一下啊,不是说异步我丢给你了我就不管了,我只是暂时没空等你,我希望你在背后帮我完成,做好了你还是要跟我说的,然后我仍需要继续处理的。可是问题是,你做好了怎么通知我呢?并且到时候你还在不在我都不知道,我收到你的通知怎么告诉你?
问题出来了,那么肯定要想办法解决啊。首先要解决的就是--"你异步处理完,怎么通知我?",要解决这个问题很简单--在我让你异步处理的时候,告诉你一个地址,你处理完后就可以通过这个地址找到我,告诉我你的处理结果。然后问题又来了,你完成后,通过地址通知我,可是不知道我是否接收到,你就会一直通知我。这个问题就更加简单了,我们约定一个字段,我给你返回特定字段,也就是告诉你我收到通知了,你就不要在通知我了。
上面的思路整清楚了,接下来就要详细实现。(Java实现)
比如现在我要买一张火车票,我们选择银联支付,支付完成后,我们会收到购票通知,也会收到银联给我们返回的扣款通知。这里面就用到了异步通知,在下单的时候,服务端请求银联的扣款接口,同时在接口告诉银联处理后返回结果通知地址,服务端收到银联的通知后,根据返回的支付结果判断是否出票。
在这个购票过程中,我们需要注意的是--目前主流的服务端框架都是Spring cloud,我们告诉第三方的异步通知地址(其实就是我们的接口请求路径),第三方处理结果通知到我们服务端,这个过程和客户端请求接口是很像的。当时目前的框架中都会又一个gateway(网关),在网关内,我们都会进行验签、路由等操作,而客户端和服务端进行交互的时候我们都会约定好验签、路由相关的数据或配置,当时和第三方对接时,我们是不可能将这些东西告诉他们的。
所以,在接收第三方异步通知的时候,我们需要考虑的首要事情就是--第三方处理的结果如何成功的通知到我们服务端内部。本地开发时可以按照我的上一篇文章《Mac配置内网穿透》配置本地ip的外网映射。正常的生产开发过程其实还涉及到另外一点--异步通知只能通知到外网地址,需要经过nginx转发后到我们的程序中,因此还需要在服务器上配置nginx,使得通知能够通过外网到我们内网服务器地址上(以后会介绍这一块内容的)。
处理结果的通知顺利进入我们程序后,我们还需要根据其返回的格式做处理,目前我对接的第三方异步通知返回的结果各种各样--JsonObject ,HttpServletRequest...,我们需要根据返回的数据格式合理的选择接收对象,当然,如果觉得麻烦,也可以自定义注解,然后将返回格式统一成自己喜欢的格式。个人比较喜欢使用HttpServletRequest接收,处理起来方便一点。最后,我们接收到通知之后,需要按照约定,返回第三方所需的字段,自此,整个异步通知过程就结束了。
但是,对于我们服务端而言,返回信息的处理才刚开始,我们需要对异步通知的内容进行验签、解密等操作,确认我们接收到的数据是合法、正确的。
Java中的异步通知的更多相关文章
- 第三十四篇:在SOUI中使用异步通知
概述 异步通知是客户端开发中常见的需求,比如在一个网络处理线程中要通知UI线程更新等等. 通常在Windows编程中,为了方便,我们一般会向UI线程的窗口句柄Post/Send一个窗口消息从而达到将非 ...
- Linux设备驱动中的异步通知与异步I/O
异步通知概念: 异步通知的意识是,一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步IO”,信号是在软件层次 ...
- java中的异步处理和Feature接口(一)
背景介绍想象这样一个场景:你可能希望为你的法国客户提供指定主题的热点报道.为实现这一功能,你需要向 谷歌或者Twitter的API请求所有语言中针对该主题最热门的评论,可能还需要依据你的内部算法 对它 ...
- java 中的异步回调
异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...
- java中同步异步阻塞和非阻塞的区别
同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等).但是一般而言,我们在说同步.异步的时候,特 ...
- Linux学习 :按键信号 之 异步通知
一.异步通知概念: 异步通知是指:一旦设备就绪,则主动通知应用程序,应用程序根本就不需要查询设备状态,类似于中断的概念,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进 ...
- linux设备驱动归纳总结(三):7.异步通知fasync【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-62725.html linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxx ...
- 蜕变成蝶~Linux设备驱动之异步通知和异步I/O
在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代.异步通知类 ...
- 【Linux开发】linux设备驱动归纳总结(三):7.异步通知fasync
linux设备驱动归纳总结(三):7.异步通知fasync xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
随机推荐
- 【翻译】 Guice 动机——依赖注入的动机
原文链接 动机 将所有的内容连接在一起时应用开发的一个单调乏味的部分.有几种方式来将数据.服务.presetntation类连接到一起.为了对比这些方法,我将为披萨订购网站编写账单代码: public ...
- JPanel与JFrame的区别
JPanel与JFrame的区别: Jpanel不是顶级窗口,不能直接输出.它必须放在象JFrame这样的顶级窗口上才能输出. JcontentPane实际上就是一个JPanel.Jframe中会默认 ...
- PostgreSQL中JSON、JSONB基本操作符
PostgreSQL 9.5以上的版本中有了很多方便的操作符,使得操作 JSON 变得非常方便了. 一. -> 和 ->> : -> 表示获取一个JSON数组元素,支持下标值( ...
- mac 删除文件夹里所有的.svn文件
先用命令行,进入你要删除的文件夹中(./ 为这个文件夹的当前路径,也可以填写绝对路径) 命令行下输入: sudo find ./ -name ".svn" -exec rm -r ...
- codeforces gym 101611C 重链剖分构造
给一棵树 要求在一个20*1e6的矩阵上放下这棵树,每个点的坐标都是整数且所有边都不相叉 题解 按照重链遍历,先给轻儿子坐标,然后沿着重儿子向下走即可 #include <bits/stdc++ ...
- technologies
RPC Apache Thrift, Thrift is an interface definition language and binary communication protocol, lik ...
- VisualStudio相关序列号
VisualStudio相关序列号 Visual Studio 2019 Enterprise:BF8Y8-GN2QH-T84XB-QVY3B-RC4DF Visual Studio 2019 ...
- python3解决 json.dumps中文乱码
使用json.dumps()运行结果如下 role_name字段中文乱码了 只需要使用ensure_ascii=False 运行结果如下:
- 《剑指offer》二叉树的深度
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 在Windows Server2016中安装SQL Server2016
SQL Server2016安装硬.软件条件:点击打开链接 WinServer2016的安装参见: 在虚拟机中安装Windows Server2016 1. SQL Server2016下载地址: - ...