Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Spring AsyncResult和Future Return_Java_Spring_Asynchronous - Fatal编程技术网

Java 如何使用Spring AsyncResult和Future Return

Java 如何使用Spring AsyncResult和Future Return,java,spring,asynchronous,Java,Spring,Asynchronous,我有一个公共接口,Synchronous,它公开给几个服务层类。它的目的是根据传递的id查找对象图,执行一些业务逻辑,然后将其传递给Spring异步方法Asynchronous.doWork以完成剩余的任务 我试图使用Spring AsyncResult,但我不确定返回的对象WorkResult实际返回到什么位置。我是否需要在SynchronousImpl中的某个位置放置处理程序?想法 同步公共服务: public class SynchronousImpl implements Synchro

我有一个公共接口,Synchronous,它公开给几个服务层类。它的目的是根据传递的id查找对象图,执行一些业务逻辑,然后将其传递给Spring异步方法Asynchronous.doWork以完成剩余的任务

我试图使用Spring AsyncResult,但我不确定返回的对象WorkResult实际返回到什么位置。我是否需要在SynchronousImpl中的某个位置放置处理程序?想法

同步公共服务:

public class SynchronousImpl implements Synchronous {
    private Asynchronous async;
    //business logic
    public void doWork(long id){
        async.doWork(id);
    }
}
public class Asynchronous {
    @Async
    public Future<WorkResult> doWork(long id){
        //business logic
        WorkResult result = new WorkResult(id, "Finished");
        return new AsyncResult<WorkResult>(result);
    }
}
异步工作类:

public class SynchronousImpl implements Synchronous {
    private Asynchronous async;
    //business logic
    public void doWork(long id){
        async.doWork(id);
    }
}
public class Asynchronous {
    @Async
    public Future<WorkResult> doWork(long id){
        //business logic
        WorkResult result = new WorkResult(id, "Finished");
        return new AsyncResult<WorkResult>(result);
    }
}
公共类异步{
@异步的
公共未来工作(长id){
//业务逻辑
工作结果=新的工作结果(id,“已完成”);
返回新的异步结果(result);
}
}
A与Spring无关,是属于java6并发框架的类

一个典型的用例是:

public void doWork(long id) {
    Future<WorkResult> futureResult = async.doWork(id);
    //Do other things.
    WorkResult result = futureResult.get(); //The invocation will block until the result is calculated.
}
public void doWork(长id){
Future futureResult=async.doWork(id);
//做其他事情。
WorkResult=futuresult.get();//调用将被阻止,直到计算出结果为止。
}
异步方法启动后(也就是Spring帮助其
@async
注释的地方),调用者立即获得
Future
对象。但未来的对象不是结果,它只是实际结果的包装器/占位符/代理/引用


现在,调用方和工作方并行运行,可以做不同的事情。调用方调用
futuresult.get()时并且实际结果还没有计算出来,这个线程会被阻塞,直到工作线程提供结果为止。(当调用者调用
futuresult.get();
并且实际结果已经计算出来时,他会立即得到结果)

因此这将阻塞同步线程并保持它直到异步线程完全正确为止?从Spring 4.1(和Java8?)有更好的东西附加到了-基本上现在可以附加回调处理程序,而不是阻塞。