From c0ff746d5718bdf654a36a002f48c5d6cfb52706 Mon Sep 17 00:00:00 2001 From: xiangwb Date: Thu, 8 Feb 2018 10:57:55 +0800 Subject: [PATCH] merge --- .../xwbing/demo/CompletableFutureDemo.java | 138 ++++++++---------- .../main/java/com/xwbing/demo/LambdaDemo.java | 26 ++-- .../src/main/java/com/xwbing/demo/demo.java | 15 +- .../xwbing/controller/other/TestControl.java | 34 +++++ .../handler/GlobalExceptionHandler.java | 22 ++- .../com/xwbing/handler/LoginInterceptor.java | 2 +- 6 files changed, 131 insertions(+), 106 deletions(-) diff --git a/boot-service/src/main/java/com/xwbing/demo/CompletableFutureDemo.java b/boot-service/src/main/java/com/xwbing/demo/CompletableFutureDemo.java index 34f70b6..0c0727c 100644 --- a/boot-service/src/main/java/com/xwbing/demo/CompletableFutureDemo.java +++ b/boot-service/src/main/java/com/xwbing/demo/CompletableFutureDemo.java @@ -7,7 +7,6 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; /** * 项目名称: boot-module-demo @@ -39,7 +38,7 @@ public class CompletableFutureDemo { } catch (InterruptedException e) { e.printStackTrace(); } - //出现异常,异常会被限制在执行任务的线程范围内 + //出现异常,异常会被限制在执行任务的线程的范围内,最终会杀死该线程,而这会导致等待 get 方法返回结果的线程永久地被阻塞。 if (1 == 1) throw new RuntimeException("异常"); return "world"; @@ -48,9 +47,11 @@ public class CompletableFutureDemo { object.put("s1", s1); object.put("s2", s2); return object; - }).exceptionally(e -> {//捕获异常 - throw new RuntimeException(e.getMessage()); - }).join(); + }) +// .exceptionally(e -> {//捕获CompletionException,如有全局异常处理,可省略 +// throw new RuntimeException(e.getMessage()); +// }) + .join(); } public static void main(String[] args) { @@ -67,29 +68,24 @@ public class CompletableFutureDemo { */ public static JSONObject thenAcceptBoth() { JSONObject jsonObject = new JSONObject(); - try { - CompletableFuture.supplyAsync(() -> { - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return "hello"; - }).thenAcceptBoth(CompletableFuture.supplyAsync(() -> { - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return "world"; - }), (s1, s2) -> { - jsonObject.put("s1", s1); - jsonObject.put("s2", s2); - }).get(); - } catch (InterruptedException | ExecutionException e) { - logger.error(e.getMessage()); - throw new RuntimeException("获取数据异常"); - } + CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "hello"; + }).thenAcceptBoth(CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "world"; + }), (s1, s2) -> { + jsonObject.put("s1", s1); + jsonObject.put("s2", s2); + }).join(); return jsonObject; } @@ -103,36 +99,32 @@ public class CompletableFutureDemo { List allResult = new ArrayList<>(); List s1 = new ArrayList<>(); List s2 = new ArrayList<>(); - try { - CompletableFuture.runAsync(() -> { - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - s1.add(1); - }).runAfterBothAsync(CompletableFuture.runAsync(() -> { - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - s2.add(1); - }), () -> { - for (int i = 0; i < s1.size(); i++) { - Integer ii = s1.get(i); - for (int j = 0; j < s2.size(); j++) { - if (j == i) { - Integer jj = s2.get(j); - allResult.add(ii + jj); - break; - } + CompletableFuture.runAsync(() -> { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + s1.add(1); + }).runAfterBothAsync(CompletableFuture.runAsync(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + s2.add(1); + }), () -> { + for (int i = 0; i < s1.size(); i++) { + Integer ii = s1.get(i); + for (int j = 0; j < s2.size(); j++) { + if (j == i) { + Integer jj = s2.get(j); + allResult.add(ii + jj); + break; } } - }).get(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException("获取数据异常"); - } + } + }).join(); return allResult; } @@ -143,25 +135,21 @@ public class CompletableFutureDemo { */ public static JSONObject acceptEither() { JSONObject object = new JSONObject(); - try { - CompletableFuture.supplyAsync(() -> { - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return "hello"; - }).acceptEither(CompletableFuture.supplyAsync(() -> { - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - return "world"; - }), s -> object.put("s", s)).get(); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException("获取数据异常"); - } + CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "hello"; + }).acceptEither(CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "world"; + }), s -> object.put("s", s)).join(); return object; } } diff --git a/boot-service/src/main/java/com/xwbing/demo/LambdaDemo.java b/boot-service/src/main/java/com/xwbing/demo/LambdaDemo.java index 539b7f1..9168245 100644 --- a/boot-service/src/main/java/com/xwbing/demo/LambdaDemo.java +++ b/boot-service/src/main/java/com/xwbing/demo/LambdaDemo.java @@ -1,7 +1,6 @@ package com.xwbing.demo; import com.alibaba.fastjson.JSONObject; -import com.xwbing.exception.BusinessException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -9,7 +8,6 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import javax.annotation.Resource; import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -85,13 +83,7 @@ public class LambdaDemo { reduce = optional.get(); } //异步回调 - CompletableFuture> future = CompletableFuture.supplyAsync(LambdaDemo::getList); - try { - List sysUsers = future.get(); - } catch (InterruptedException | ExecutionException e) { - logger.error(e.getMessage()); - throw new BusinessException("获取数据出错"); - } + List sysUsers = CompletableFuture.supplyAsync(LambdaDemo::getList).join(); } /** @@ -110,14 +102,14 @@ public class LambdaDemo { futures[i] = CompletableFuture.runAsync(() -> System.out.println("null")); } } -// CompletableFuture.allOf(futures).join();//线程等待,效果等同于get(),不用抛检测异常,不推荐 - CompletableFuture completableFuture = CompletableFuture.allOf(futures); - try { - completableFuture.get(); - } catch (InterruptedException | ExecutionException e) { - logger.error(e.getMessage()); - throw new BusinessException("获取数据出错"); - } + CompletableFuture.allOf(futures).join();//线程等待,效果等同于get(),会拋出CompletionException +// CompletableFuture completableFuture = CompletableFuture.allOf(futures); +// try { +// completableFuture.get(); +// } catch (InterruptedException | ExecutionException e) { +// logger.error(e.getMessage()); +// throw new BusinessException("获取数据出错"); +// } return finalList; } diff --git a/boot-service/src/main/java/com/xwbing/demo/demo.java b/boot-service/src/main/java/com/xwbing/demo/demo.java index 16d0eb8..fdfee2e 100644 --- a/boot-service/src/main/java/com/xwbing/demo/demo.java +++ b/boot-service/src/main/java/com/xwbing/demo/demo.java @@ -1,8 +1,6 @@ package com.xwbing.demo; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; +import java.util.concurrent.ExecutionException; /** * 项目名称: boot-module-demo @@ -11,14 +9,7 @@ import java.util.stream.Collectors; * 说明: 测试用 */ public class demo { - public static void main(String[] args) { - long l = System.currentTimeMillis(); - List list = new ArrayList<>(); - for (int i = 0; i < 100000; i++) { - list.add(i); - } - list = list.stream().map(integer -> integer * 10).collect(Collectors.toList()); - long l1 = System.currentTimeMillis(); - System.out.println(l1 - l); + public static void main(String[] args) throws ExecutionException, InterruptedException { + } } diff --git a/boot-web/src/main/java/com/xwbing/controller/other/TestControl.java b/boot-web/src/main/java/com/xwbing/controller/other/TestControl.java index 2dae681..15299ce 100644 --- a/boot-web/src/main/java/com/xwbing/controller/other/TestControl.java +++ b/boot-web/src/main/java/com/xwbing/controller/other/TestControl.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.xwbing.annotation.LogInfo; import com.xwbing.domain.entity.ExpressInfo; import com.xwbing.domain.entity.vo.ExpressInfoVo; +import com.xwbing.exception.BusinessException; import com.xwbing.redis.RedisService; import com.xwbing.service.other.CookieSessionService; import com.xwbing.service.other.ExpressDeliveryService; @@ -23,6 +24,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 说明: 测试控制层 @@ -129,4 +131,36 @@ public class TestControl { public JSONObject cookie(HttpServletRequest request, HttpServletResponse response) { return JSONObjResult.toJSONObj(cookieSessionService.cookie(response, request)); } + + @LogInfo("completableFuture") + @GetMapping("completableFuture") + public JSONObject completableFuture() { + return JSONObjResult.toJSONObj(thenCombine(), ""); + } + + private JSONObject thenCombine() { + return CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return "hello"; + }).thenCombine(CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + //出现异常,异常会被限制在执行任务的线程范围内 + if (1 == 1) + throw new RuntimeException("545456"); + return "world"; + }), (s1, s2) -> { + JSONObject object = new JSONObject(); + object.put("s1", s1); + object.put("s2", s2); + return object; + }).join(); + } } diff --git a/boot-web/src/main/java/com/xwbing/handler/GlobalExceptionHandler.java b/boot-web/src/main/java/com/xwbing/handler/GlobalExceptionHandler.java index 2b3100f..98f835c 100644 --- a/boot-web/src/main/java/com/xwbing/handler/GlobalExceptionHandler.java +++ b/boot-web/src/main/java/com/xwbing/handler/GlobalExceptionHandler.java @@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; +import java.util.concurrent.CompletionException; import java.util.stream.Collectors; /** @@ -43,11 +44,30 @@ public class GlobalExceptionHandler { // 返回给页面200状态码 @ResponseStatus(value = HttpStatus.OK) @ResponseBody - public JSONObject handlerGuideException(BusinessException ex) { + public JSONObject handlerBusinessException(BusinessException ex) { logger.error(ex.getMessage()); return JSONObjResult.toJSONObj(ex.getMessage()); } + /** + * CompletableFuture完成结果或任务过程中出现的异常 + * + * @param ex + * @return + */ + @ExceptionHandler(value = CompletionException.class) + @ResponseStatus(value = HttpStatus.OK) + @ResponseBody + public JSONObject handlerCompletionException(CompletionException ex) { + Throwable cause = ex.getCause(); + String errorMessages = cause.getMessage(); + logger.error(errorMessages); + String detail = cause.toString(); + if (!detail.contains("BusinessException")) + errorMessages = "异步获取数据出错"; + return JSONObjResult.toJSONObj(errorMessages); + } + /** * 表单检验(validator) 异常 * diff --git a/boot-web/src/main/java/com/xwbing/handler/LoginInterceptor.java b/boot-web/src/main/java/com/xwbing/handler/LoginInterceptor.java index 36175e9..98621e6 100644 --- a/boot-web/src/main/java/com/xwbing/handler/LoginInterceptor.java +++ b/boot-web/src/main/java/com/xwbing/handler/LoginInterceptor.java @@ -42,7 +42,7 @@ public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String servletPath = request.getServletPath(); - if (!set.contains(servletPath) && !servletPath.contains("login")) { + if (!set.contains(servletPath) && !servletPath.contains("login") && !servletPath.contains("test")) { // HttpSession session = request.getSession(); // if (session.getAttribute(CommonConstant.CURRENT_USER)!=null) { // return true;