Java Spring 3.2@Async任务,返回类型为Future

Java Spring 3.2@Async任务,返回类型为Future,java,spring,asynchronous,Java,Spring,Asynchronous,我正在尝试实现一个spring@Async任务,它的返回类型是Future, 但我真的不知道如何正确地做 这样做我会得到什么?我现在是否可以控制我的任务,以便停止它并运行它 有没有关于我如何做到这一点的参考实现?springsource不提供任何 编辑 从弹簧源和弹簧参考手册: 甚至返回值的方法也可以异步调用。然而,这种方法是必需的 具有未来类型化的返回值。这仍然提供了异步执行的好处,因此 调用方可以在以后调用get()之前执行其他任务 它给出了这样一个例子: @Async Future<

我正在尝试实现一个spring@Async任务,它的返回类型是Future, 但我真的不知道如何正确地做

  • 这样做我会得到什么?我现在是否可以控制我的任务,以便停止它并运行它
  • 有没有关于我如何做到这一点的参考实现?springsource不提供任何
  • 编辑

    从弹簧源和弹簧参考手册:

    甚至返回值的方法也可以异步调用。然而,这种方法是必需的 具有未来类型化的返回值。这仍然提供了异步执行的好处,因此 调用方可以在以后调用get()之前执行其他任务

    它给出了这样一个例子:

    @Async
    Future<String> returnSomething(int i) {
    // this will be executed asynchronously
    }
    
    @Async
    未来回报(int i){
    //这将异步执行
    }
    

    如何正确实现这一点?

    ExecutorService可以安排Callable并返回未来的对象。 未来是一个占位符,一旦结果可用,它就包含结果。它允许您检查结果是否存在、取消任务或阻止并等待结果。只有当您期望从任务中获得某些对象/价值时,未来才有用

    进行未来通话的正确方法是:

    Future<Integer> futureEvenNumber = executorService.submit(new NextEvenNumberFinder(10000));
    
    // Do something.
    
    try {
       Integer nextEvenNumber = futureEvenNumber.get();
    } catch (ExecutionException e) {
       System.err.println("NextEvenNumberFinder threw exception: " + e.getCause());
    }
    
    Future-futureevenumbernumber=executorService.submit(新的nexteevenumberfinder(10000));
    //做点什么。
    试一试{
    整数nextEventNumber=futureEventNumber.get();
    }捕获(执行例外){
    System.err.println(“nextEventNumberFinder引发异常:”+e.getCause());
    }
    
    下一个EventNumberFinder类:

    public class NextEvenNumberFinder implements Callable<Integer> {
    private int number;
    
    public NextEvenNumberFinder(int number) { this.number = number; }
    
    @Override
    public Integer call() throws Exception {
        for (;;)
            if (isEvenNumber(++number)) return number;
    }
    
    public类nextEventNumberFinder实现可调用{
    私有整数;
    public-nextEventNumberFinder(整数){this.number=number;}
    @凌驾
    公共整数调用()引发异常{
    对于(;;)
    if(isEvenNumber(++number))返回编号;
    }
    
    }

    Spring集成参考手册:

    请检查

    使用
    @Async
    可以异步运行方法中的计算。这意味着,如果调用了该控件(在Spring管理的bean上),该控件将立即返回给调用方,并且该方法中的代码将在另一个线程中运行。调用者接收绑定到正在运行的计算的
    Future
    对象,并可以使用该对象检查计算是否正在运行和/或等待结果

    创建这样一个方法很简单。用
    @Async
    对其进行注释,并将结果包装在
    AsyncResult
    中,如博文所示。

    查看此内容

    重要的配置是:

  • Spring托管bean方法上的
    @Async
  • 通过定义以下内容在Spring配置XML中启用异步:
  • 
    
    默认情况下将使用SimpleSynctAskeExecutor

    将响应包装在
    未来的
    对象中


    例子
    @Async
    公共未来生成文档(FooBarBean){
    //做些逻辑分析
    返回新的异步结果(result);
    }
    

    然后,您可以使用
    result.isDone()
    检查结果是否完成,或者等待获得响应
    result.get()

    ,这意味着如果任务尚未取消,我可以随时停止任务,对吗?@Developer106是的,您可以通过调用返回的
    Future
    来中断异步方法。但这种中断并不是自动发生的。方法应该通过调用
    线程.isInterrupted()
    来检查中断,或者使用抛出
    中断异常的方法。请参阅Java教程中的。为什么结果必须包装在AsyncResult中?@user1860447,因为如果结果是异步计算的,您需要一种方法来查询结果是否准备就绪,并能够等待它(可能有一个超时)或者取消异步计算。@PetrPudlák,如果我需要异步执行任务,并且需要立即获得
    taskId
    (表示任务注册的
    字符串,帮助用户跟踪任务进度),如果
    taskId
    必须在用
    @Async
    注释的方法中生成,而不是由调用程序生成,那么如何实现这一点?
    @Async
    public Future<PublishAndReturnDocumentResult> generateDocument(FooBarBean bean) {  
        // do some logic  
        return new AsyncResult<PublishAndReturnDocumentResult>(result);
    }