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 ...
随机推荐
- Eclipse使用JDBC小案例
JDBC(Java Database Connectivity:Java访问数据库的解决方案)定义一套标准接口,即访问数据库的通用API,不同数据库厂商根据各自数据的特点去实现这些接口. JDBC是J ...
- Linux的快捷键一
- [工具开发] Grafana 报警仪表盘
Grafana 自V4以来加入了报警功能,所有的报警都集中在 Alert List 菜单里,数量多的话,查看起来很不方便.如下图: 为此我制作了一个简单的 Grafana Alert Dashboar ...
- 最新传智播客web前端开发39期视频教程【完整版】
本套视频为传智2018web前端开发全套视频教程基础班+就业班,视频+源码+案例笔记,全套高清不加密~2018最新传智播客视频! 本教程是实战派课程!为传智最新web前端39期,挑战全网最全视频,没有 ...
- 函数节流和函数防抖JavaScript实现
函数节流 function throttle(fn, delay = 1000) { let Running = false; return function () { if (Running) { ...
- Vue + Element UI项目初始化
1.安装相关组件 1.1安装Node 检查本地是否安装node node -v 如果没有安装,从Node官网下载 1.2安装npm npm -v 如果没有安装:使用该指令安装: npm install ...
- cocos2dx模拟器修改窗口大小
修改模拟器窗口大小SimulatorWin.cpp搜索 frameSize修改frameSize = Size(1920*0.9, 1080*0.9);
- 洛谷 P2330 [SCOI2005]繁忙的都市
题目链接 https://www.luogu.org/problemnew/show/P2330 题目描述 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市 ...
- kmp算法:
自学kmp算法: first time:wa #include<cstdio> #include<algorithm> #include<iostream> #in ...
- 解决ODBC连接Oracle数据库报Unable to connect SQLState=08004问题
今天用ODBC连接Oracle数据库时,报了这么一个错“Unable to connect SQLState=08004 Oracle ODBC Ora-12154”,上网查了好久都说PowerDes ...