异步调用

CompletableFuture异步调用

a 夏天 提交于 2020-02-04 23:45:34
提要:在大型的项目某个主业务里,某个请求的调用,需要访问许多个微服务,才可以完成,但由于是远程调用,多微服务调用之间的延迟太高,用户的体验度太差,所以使用异步编排技术,由起初的一个线程执行,到多个线程异步执行,缩短请求的时间。 CompletableFuture介绍 Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用 isDone 方法检查计算是否完成,或者使用 get 阻塞住调用线程,直到计算完成返回结果,你也可以使用 cancel 方法停止任务的执行。 虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,只能通过阻塞或者轮询的方式得到任务的结果。阻塞的方式显然和我们的异步编程的初衷相违背,轮询的方式又会耗费无谓的CPU资源,而且也不能及时地得到计算结果,为什么不能用观察者设计模式当计算结果完成及时通知监听者呢? 很多语言,比如Node.js,采用回调的方式实现异步编程。Java的一些框架,比如Netty,自己扩展了Java的 Future 接口,提供了 addListener 等多个扩展方法;Google guava也提供了通用的扩展Future;Scala也提供了简单易用且功能强大的Future/Promise异步编程模式。 作为正统的Java类库,是不是应该做点什么,加强一下自身库的功能呢? 在Java 8中

Nodejs之路:异步I/O的过程

好久不见. 提交于 2020-02-04 07:58:27
对于Node中的异步I/O调用,从发出调用到回调执行,看起来像普通的js异步,但是流程却和普通js那些消息队列完全不同,整个过程经历了哪些? 下面以Windows平台下为例: 一,异步调用第一阶段: 1,首先JavaScript调用Node的核心模块,核心模块再调用C++内建模块,内建模块通过libuv进行系统调用。(这里的libuv是抽象封装层,使得平台兼容性的判断都由这一层来实现,并保证上层的Node与下层的自定义线程及IOCP之间互相独立。Node在编译期间会判断平台条件,选择性编译unix目录或是win目录下的源文件到目标程序中。) 内建模块调用过程中,会创建一个FSReqWrap 请求对象 ,从JavaScript层传入的参数和当前方法都被封装在这个请求对象中,而回调函数则被设置在这个请求对象的oncomplete_sym属性上。 2,对象包装完毕后,在Windows下,则调用QueueUserWorkItem()方法将这个FSReqWrap请求对象推入线程池中等待执行,该方法使用代码如下: QueueUserWorkItem( &uv_fs_thread_proc, req, WT_EXECUTEDEFAULT ) 这个方法接收三个参数,第一个是将要执行的方法的引用,这里的例子是uv_fs_thread_proc, 这里实际上就是要执行的I/O操作实际对应的方法

今天遇到的js的问题(ajax赋值 与 多次绑定)

给你一囗甜甜゛ 提交于 2020-02-02 15:27:55
get方法返回值并赋值给全局变量undefined的问题 因为ajax是异步调用,所以在赋值return的时候,response还没有回来,所以造成返回了undefined值的现象 解决方法:将ajax的异步调用置为false,如: $.ajax({ type:'GET', url:"“, dataType:'json', async:false, success:function(data){ response = data; } }); 事件多次绑定问题 当点击一次click事件之后未刷新状态下点击第二次将再次绑定click事件,因此会进行重复调用 解决方法参考 https://blog.csdn.net/GSCurry/article/details/71857127 来源: CSDN 作者: Shantel Wong 链接: https://blog.csdn.net/sinat_33758988/article/details/104141633

异步请求与异步调用的区别

丶灬走出姿态 提交于 2020-02-01 05:20:17
异步请求与异步调用的区别 两者的使用场景不同,异步请求用来解决并发请求对服务器造成的压力,从而提高对请求的吞吐量;而异步调用是用来做一些非主线流程且不需要实时计算和响应的任务,比如同步日志到kafka中做日志分析等。 异步请求是会一直等待response相应的,需要返回结果给客户端的;而异步调用我们往往会马上返回给客户端响应,完成这次整个的请求,至于异步调用的任务后台自己慢慢跑就行,客户端不会关心。 1、异步请求的实现 方式一:Servlet方式实现异步请求 @RequestMapping(value = "/email/servletReq", method = GET) public void servletReq (HttpServletRequest request, HttpServletResponse response) { AsyncContext asyncContext = request.startAsync(); //设置监听器:可设置其开始、完成、异常、超时等事件的回调处理 asyncContext.addListener(new AsyncListener() { @Override public void onTimeout(AsyncEvent event) throws IOException { System.out.println("超时了..

java中5种异步转同步方法

天大地大妈咪最大 提交于 2020-01-28 20:45:04
先来说一下对异步和同步的理解: 同步调用:调用方在调用过程中,持续等待返回结果。 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数。 其实,两者的区别还是很明显的,这里也不再细说,我们主要来说一下Java如何将异步调用转为同步。换句话说,就是需要在异步调用过程中,持续阻塞至获得调用结果。 不卖关子,先列出五种方法,然后一一举例说明: 使用wait和notify方法,synchronized 使用条件锁ReentrantLock Future 使用CountDownLatch 使用CyclicBarrier 0.构造一个异步调用 首先,写demo需要先写基础设施,这里的话主要是需要构造一个异步调用模型。异步调用类: public class AsyncCall { private Random random = new Random(System.currentTimeMillis()); private ExecutorService tp = Executors.newSingleThreadExecutor(); //demo1,2,4,5调用方法 public void call(BaseDemo demo){ new Thread(()->{ long res = random.nextInt(10); try { Thread

WCF在同步和异步调用情况下的异常捕获

若如初见. 提交于 2020-01-27 08:01:01
WCF在同步和异常调用情况下的异常捕获 1 前言 关于WCF的基本信息,我就不在这里介绍了。一来是因为园子中的很多人都介绍过了,而且很是详细,再不行,还可以看书。二来是因为自己的概念表达还不是很好,别误导了大家。 在这里,我就直接讲解一种用法,然后贴点代码吧。 在WCF有一种契约,叫做错误契约FaultContract。 今天我就讲解一下,在同步和异步调用WCF服务的时候,客户端如何捕获服务端抛出来的异常。捕获之后,如何处理,那就是根据项目的要求了。是提示呢?还是记录日志呢?还是其他什么的。。。。。。。。。。。。 2 正文 其他对于同步和异步来说,WCF处理异常的手段是一致的。都是将异常信息,通过我们自定义的一个异常信息类,传输到客户端。客户端获取到这个类的信息,然后就知道了具体的异常。然后如何处理,就是客户端的事情了。 2.1 服务定义 错误契约定义 [DataContract] public class CallException { public CallException() { } public CallException(string message, string detail) { Message = message; Detail = detail; } [DataMember] public string Message { get; set; }

委托与异步调用

孤街浪徒 提交于 2020-01-24 02:01:36
委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似。与 C 中的函数指针不同,委托是面向对象的、类型安全的和保险的。委托的类型由委托的名称定义。下面的示例声明了一个名为 Del 的委托,该委托可以封装一个采用字符串作为参数并返回 void 的方法。 public partial class Form2 : Form { //申明委托 delegate void LockWindowDelegate(bool enabled); //定义委托对象 private LockWindowDelegate _lockWindow; public Form2() { InitializeComponent(); //对象初始化 _lockWindow = new LockWindowDelegate(lochFunction); } private void startAsyncButton_Click(object sender, EventArgs e) { //异步调用1 this.BeginInvoke(_lockWindow, true); //异步调用2 IAsyncResult iar= _lockWindow.BeginInvoke(true,null,null); //停止调用 _lockWindow.EndInvoke(iar); } private

委托异步调用方法

血红的双手。 提交于 2020-01-24 01:59:09
public delegate string CaptureHandler(string ip); public class CaptureService { public static string CapturePicture(string ip) { Thread.Sleep(3000); Console.WriteLine("work done part one"); return ip.ToString(); } } static void Main(string[] args) { //Thread t = new Thread(new ParameterizedThreadStart(functionA)); CaptureHandler handler = new CaptureHandler(CaptureService.CapturePicture); IAsyncResult result = handler.BeginInvoke("192.168.0.109", new AsyncCallback(SaveDb), handler); Console.WriteLine("main work continue"); Console.ReadKey(); } private static void SaveDb(IAsyncResult ar) { if

委托异步调用 VB

南楼画角 提交于 2020-01-24 01:56:05
Imports System.Delegate Imports System.Threading Delegate Function BinaryOp(ByVal arg1 As Integer, ByVal arg2 As Integer) As Integer Module Module1 Sub Main() Dim b As BinaryOp = AddressOf Add Dim IAR As IAsyncResult = b.BeginInvoke(10, 10, IAR, vbNull) While IAR.IsCompleted <> True Console.WriteLine("Main thread") End While Dim results As Integer = b.EndInvoke(IAR) Console.WriteLine(results) Console.Read() End Sub Public Function Add(ByVal arg1 As Integer, ByVal arg2 As Integer) As Integer Thread.Sleep(3000) Return arg1 + arg2 End Function End Module 来源: https://www.cnblogs.com/qixue/archive

委托的异步调用

隐身守侯 提交于 2020-01-24 00:46:11
public delegate void deleGetUserList(object sdf);//定义一个委托 deleGetUserList du = new deleGetUserList(GetUserList); du.BeginInvoke(AdminId, null, null); public void GetUserList(Object str) {} 异步调用相当于在主线程中开辟了一个新的线程在后台来执行需要异步调用的方法,在这个方法中如果要操作其他控件(比如将文本框填入某一字符串),就 会抛出一个cross-thread异常,这个异常是由于编译器出于安全考虑,不允许不是创建这个控件的线程来调用这个控件(文本框).解决的方法是:     在这个另外的一个线程中通过使用这个控件的Invoke(Delegate method,params object[] args)方法,Invoke可以调用一个委托,可以在这个委托所代表的方法中对这个控件进行操作;     Invoke有2个参数,第一个是要执行操作的方法的代理,第二个是要执行操作的方法需要的参数对象数组.     下面是一个小例子(在按钮事件新建立的线程中对一个文本框写入"helloworld"字符串): delegate void AddMsgDel(string msg); private void