异步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回调的转换方法。我看这里没有问题。