本文共 7100 字,大约阅读时间需要 23 分钟。
# 支付相关的配置pay.threadNamePrefix=pay-exec-pay.maxPoolSize=20pay.corePoolSize=10pay.queueCapacity=1000
/** * 配置支付线程池 */@EnableAsync@Configurationpublic class PayThreadPoolsConfig { /** * 支付线程相关参数 */ @Value("${pay.threadNamePrefix}") private String threadNamePrefix; // 配置线程池中的线程名称前缀 @Value("${pay.corePoolSize}") private Integer corePoolSize; // 配置线程池中的核心线程数 @Value("${pay.maxPoolSize}") private Integer maxPoolSize; // 配置最大线程数 @Value("${pay.queueCapacity}") private Integer queueCapacity; // 配置队列大小 /** * 支付线程池配置 * @return */ @Bean public AsyncTaskExecutor paymentTaskExexutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setThreadNamePrefix(threadNamePrefix); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(queueCapacity); // 设 executor.setRejectedExecutionHandler(new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { // TODO } }); return executor; }}
/** * 支付 异步服务类 */@Service@Slf4jpublic class PayAsyncService { /** * 无参数回调 */ @Async(value = "paymentTaskExexutor") public void asyncNoReturn() { log.info("async no return"); } /** * 带参数的异步回调 异步方法可以传入参数 * @param arg */ @Async(value = "paymentTaskExexutor") public void asyncInvokeWithParam1(CountDownLatch countDownLatch, String arg) { log.info("async1 invoke with param is :{}", arg); countDownLatch.countDown(); } @Async(value = "paymentTaskExexutor") public void asyncInvokeWithParam2(CountDownLatch countDownLatch, String arg) { log.info("async2 invoke with param is :{}", arg); countDownLatch.countDown(); } /** * 异步回调返回future * @param arg * @return */ @Async(value = "paymentTaskExexutor") public FutureasyncInvokeReturnFuture(String arg) { log.info("async invoke return future success"); for (int i=0; i<10; i++) { log.info("{} output i:{}", arg, i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } Future future = new AsyncResult<>(arg + " success!"); return future; } @Async(value = "paymentTaskExexutor") public Future asyncInvokeReturnFuture2(String arg) { log.info("async invoke return future failed"); for (int i=0; i<10; i++) { log.info("{} output i:{}", arg, i); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } Future future = new AsyncResult<>(arg + "failed!"); return future; }}
@RestController@Slf4jpublic class ExampleController { @Autowired private PayAsyncService payAsyncService; @RequestMapping(value = "/test") public String getTest() throws InterruptedException { payAsyncService.asyncNoReturn(); log.info("get test"); return "hello3"; } @RequestMapping(value = "/test2") public String getTest2() { final CountDownLatch countDownLatch = new CountDownLatch(2); payAsyncService.asyncInvokeWithParam1(countDownLatch,"timchen"); payAsyncService.asyncInvokeWithParam2(countDownLatch,"timchen"); log.info("get test2"); return "test2"; } @RequestMapping(value = "/test3") public String getTest3() throws InterruptedException, ExecutionException { Futurefuture1 = payAsyncService.asyncInvokeReturnFuture( "timchen"); Future future2 = payAsyncService.asyncInvokeReturnFuture2("xixi"); while (!future1.isDone() || !future2.isDone()) {// log.info("futre1 is:{}, futre2 is:{}", future1.isDone(), future2.isDone()); } if (future1.isDone() && future1.isDone()) { log.info("future1 return result is:{}, future2 return result is:{}.", future1.get(), future2.get()); } log.info("get test3"); return "test3"; }}
转载地址:http://agomi.baihongyu.com/