Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
异步Spring Rest控制器-处理未来结果_Spring_Spring Mvc - Fatal编程技术网

异步Spring Rest控制器-处理未来结果

异步Spring Rest控制器-处理未来结果,spring,spring-mvc,Spring,Spring Mvc,我是期货新手,我正试图弄清楚如何在这个塞纳里奥中处理可倾听的未来: @Controller @EnableAutoConfiguration public class ListenableFutureAsyncController { @Autowired IHeavyLiftingService heavyLiftingService; @RequestMapping("/") @ResponseBody DeferredResult<Stri

我是期货新手,我正试图弄清楚如何在这个塞纳里奥中处理可倾听的未来:

@Controller
@EnableAutoConfiguration
public class ListenableFutureAsyncController {

    @Autowired
    IHeavyLiftingService heavyLiftingService;

    @RequestMapping("/")
    @ResponseBody
    DeferredResult<String> home() {
        // Create DeferredResult
        final DeferredResult<String> result = new DeferredResult<>();

        //Call to the async service
        ListenableFuture<ResponseEntity<String>> future = heavyLiftingService.heavyLifting();

        future.addCallback(
          new ListenableFutureCallback<ResponseEntity<String>>() {
            @Override
            public void onSuccess(ResponseEntity<String> response) {
                result.setResult(response.getBody());
            }

            @Override
            public void onFailure(Throwable t) {
                result.setErrorResult(t.getMessage());
            }
        });
        // Return the thread to servlet container, 
        // the response will be processed by another thread.
        return result;
    }

}
@控制器
@启用自动配置
公共类ListenableFutureAyncController{
@自动连线
i重型提升服务重型提升服务;
@请求映射(“/”)
@应答器
延迟结果主页(){
//创建延迟结果
最终递延结果=新递延结果();
//调用异步服务
ListenableFuture=heavyLiftingService.heavyLifting();
future.addCallback(
新建ListenableFutureCallback(){
@凌驾
成功时的公共无效(响应性响应){
result.setResult(response.getBody());
}
@凌驾
失效时的公共无效(可丢弃的t){
result.setErrorResult(t.getMessage());
}
});
//将线程返回到servlet容器,
//响应将由另一个线程处理。
返回结果;
}
}
除了将未来传递给控制器,我如何处理未来。如果我想将未来的字符串保存到数据库中怎么办

@Service
public class HeavyLiftingServiceImpl implements IHeavyLiftingService {

    public ListenableFuture<String> heavyLifting() {
        AsyncRestTemplate asycTemp = new AsyncRestTemplate();
        ListenableFuture<String> future = asycTemp.execute(url, method, requestCallback, responseExtractor, urlVariable);
        /** 
        /Save future string to db
        **/
        return future;
    }
}
@服务
公共类HeavyLiftingServiceImpl实现IHeavyLiftingService{
公开上市未来重型运输(){
AsyncRestTemplate asycTemp=新的AsyncRestTemplate();
ListenableFuture=asycTemp.execute(url、方法、requestCallback、responseExtractor、urlVariable);
/** 
/将未来字符串保存到数据库
**/
回归未来;
}
}

我找到了一种使用Spring的
ListenableFutureAdapter实现这一点的方法

@Service
public class HeavyLiftingServiceImpl implements IHeavyLiftingService {

    public ListenableFuture<String> heavyLifting() {
        AsyncRestTemplate asycTemp = new AsyncRestTemplate();
        ListenableFuture<String> future = asycTemp.execute(url, method, requestCallback, responseExtractor, urlVariable);

        ListenableFutureAdapter<String, String> chainedFuture;
        chainedFuture = new ListenableFutureAdapter<String, String>(future) {

            @Override
            protected String adapt(String adapteeResult)
                    throws ExecutionException {
                        String parsedString = parse(adapteeResult);
                        return adapteeResult;
            }
        };

        return chainedFuture;
    }

}
@服务
公共类HeavyLiftingServiceImpl实现IHeavyLiftingService{
公开上市未来重型运输(){
AsyncRestTemplate asycTemp=新的AsyncRestTemplate();
ListenableFuture=asycTemp.execute(url、方法、requestCallback、responseExtractor、urlVariable);
ListenableFutureAdapterChainedFuture;
chainedFuture=新的ListenableFutureAdapter(未来){
@凌驾
受保护的字符串自适应(字符串自适应结果)
抛出ExecutionException{
String parsedString=parse(adapteresult);
返回自适应结果;
}
};
回报链未来;
}
}

我建议使用Guava的listenable future实现。我发现它更具可读性,关于将它们链接在一起的文档也更容易找到。

我找到了一种使用Spring的
ListenableFutureAdapter实现这一点的方法

@Service
public class HeavyLiftingServiceImpl implements IHeavyLiftingService {

    public ListenableFuture<String> heavyLifting() {
        AsyncRestTemplate asycTemp = new AsyncRestTemplate();
        ListenableFuture<String> future = asycTemp.execute(url, method, requestCallback, responseExtractor, urlVariable);

        ListenableFutureAdapter<String, String> chainedFuture;
        chainedFuture = new ListenableFutureAdapter<String, String>(future) {

            @Override
            protected String adapt(String adapteeResult)
                    throws ExecutionException {
                        String parsedString = parse(adapteeResult);
                        return adapteeResult;
            }
        };

        return chainedFuture;
    }

}
@服务
公共类HeavyLiftingServiceImpl实现IHeavyLiftingService{
公开上市未来重型运输(){
AsyncRestTemplate asycTemp=新的AsyncRestTemplate();
ListenableFuture=asycTemp.execute(url、方法、requestCallback、responseExtractor、urlVariable);
ListenableFutureAdapterChainedFuture;
chainedFuture=新的ListenableFutureAdapter(未来){
@凌驾
受保护的字符串自适应(字符串自适应结果)
抛出ExecutionException{
String parsedString=parse(adapteresult);
返回自适应结果;
}
};
回报链未来;
}
}

我建议使用Guava的listenable future实现。我发现它更具可读性,关于将它们链接在一起的文档也更容易找到。

为什么要在这里使用未来?是否希望请求立即返回,然后稍后再进行保存?假设异步模板调用运行了10秒钟。我不希望servlet线程占用线程那么长时间。您是否希望客户端必须进行第二次调用才能返回结果?我不确定是否有方法返回结果而不阻塞servlet线程。不,在本例中,延迟的结果会将线程释放回servlet容器。当结果可用时,将触发回调,并将响应发送回调用方。我试图做的是在调用回调之前,找出如何对结果执行附加处理。我相信这是可以做到的。我只是不知道如何正确地将回调链接在一起。现在我正在研究Guavas Future classAdd回调的转换方法。我看这里没有问题。你为什么要在这里使用未来?是否希望请求立即返回,然后稍后再进行保存?假设异步模板调用运行了10秒钟。我不希望servlet线程占用线程那么长时间。您是否希望客户端必须进行第二次调用才能返回结果?我不确定是否有方法返回结果而不阻塞servlet线程。不,在本例中,延迟的结果会将线程释放回servlet容器。当结果可用时,将触发回调,并将响应发送回调用方。我试图做的是在调用回调之前,找出如何对结果执行附加处理。我相信这是可以做到的。我只是不知道如何正确地将回调链接在一起。现在我正在研究Guavas Future classAdd回调的转换方法。我看这里没有问题。