栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring4-3 适配jdk8的CompletableFuture

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring4-3 适配jdk8的CompletableFuture

1.DeferredResultMethodReturnValueHandler

旧版本(<4.3)

@Override
	public void handleReturnValue(Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {

		if (returnValue == null) {
			mavContainer.setRequestHandled(true);
			return;
		}

		DeferredResult deferredResult = (DeferredResult) returnValue;
		WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(deferredResult, mavContainer);
	}

新版本(≥4.3)

@Override
	public void handleReturnValue(Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {

		if (returnValue == null) {
			mavContainer.setRequestHandled(true);
			return;
		}

		DeferredResultAdapter adapter = getAdapterFor(returnValue.getClass());
		if (adapter == null) {
			throw new IllegalStateException(
					"Could not find DeferredResultAdapter for return value type: " + returnValue.getClass());
		}
		DeferredResult result = adapter.adaptToDeferredResult(returnValue);
		WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(result, mavContainer);
	}

这里面添加了对CompletionStage(CompletableFuture)的特殊处理,即将CompletableFuture适配为DeferredResult

@UsesJava8
	private static class CompletionStageAdapter implements DeferredResultAdapter {

		@Override
		public DeferredResult adaptToDeferredResult(Object returnValue) {
			Assert.isInstanceOf(CompletionStage.class, returnValue, "CompletionStage expected");
			final DeferredResult result = new DeferredResult();
			@SuppressWarnings("unchecked")
			CompletionStage future = (CompletionStage) returnValue;
			future.handle(new BiFunction() {
				@Override
				public Object apply(Object value, Throwable ex) {
					if (ex != null) {
						result.setErrorResult(ex);
					}
					else {
						result.setResult(value);
					}
					return null;
				}
			});
			return result;
		}
	} 

但是这里面就会模糊掉(牺牲掉)DeferredResult里面原来有的超时/完成回调这部分的功能。

更新版本(≥5.0)

实现没有变化,只是干掉了adapter接口

else if (returnValue instanceof CompletionStage) {
			result = adaptCompletionStage((CompletionStage) returnValue);
		}
private DeferredResult adaptCompletionStage(CompletionStage future) {
		DeferredResult result = new DeferredResult<>();
		future.handle((BiFunction) (value, ex) -> {
			if (ex != null) {
				result.setErrorResult(ex);
			}
			else {
				result.setResult(value);
			}
			return null;
		});
		return result;
	} 
2.spring原生代码 

4.3.x增加了对CompletionStage返回值的处理:spring-framework/DeferredResultMethodReturnValueHandler.java at 4.3.x · spring-projects/spring-framework · GitHub

5.0.x删除了DeferredResultAdapter这个接口:spring-framework/DeferredResultMethodReturnValueHandler.java at 5.0.x · spring-projects/spring-framework · GitHub

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号