日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring开启方法异步执行

發(fā)布時(shí)間:2023/12/3 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring开启方法异步执行 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自?Spring開(kāi)啟方法異步執(zhí)行

?

?

@EnableAsync

@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AsyncConfigurationSelector.class) public @interface EnableAsync {Class<? extends Annotation> annotation() default Annotation.class;boolean proxyTargetClass() default false;AdviceMode mode() default AdviceMode.PROXY;int order() default Ordered.LOWEST_PRECEDENCE;}

@EnableAsync注解即開(kāi)啟Spring對(duì)方法異步執(zhí)行的能力,需要和注解@Configuration配合使用。

@Configuration @EnableAsync public class AppConfig {}

也可以自定義線程池

@Configuration@EnableAsyncpublic class AppConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(7);executor.setMaxPoolSize(42);executor.setQueueCapacity(11);executor.setThreadNamePrefix("MyExecutor-");executor.initialize();return executor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return MyAsyncUncaughtExceptionHandler();}}

@Async

@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Async {String value() default "";}

在要異步執(zhí)行的方法上使用@Async注解,下面是一個(gè)沒(méi)有返回值,一個(gè)帶有返回值的異步調(diào)用的示例。

@Component public class AsyncTask {@Asyncpublic void task1() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}}@Asyncpublic Future<String> task2() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}return new AsyncResult<String>("javastack"); ?}}

測(cè)試代碼

@RunWith(SpringRunner.class) @SpringBootTest public class AsyncTest {private final static Logger log = LoggerFactory.getLogger(AsyncTest.class);@Autowiredprivate AsyncTask asyncTask;@Testpublic void testTask1(){log.info("start");asyncTask.task1();log.info("finish");}@Testpublic void testTask2() ?{log.info("start");Future<String> future = asyncTask.task2();while (true) {if (future.isDone()) {try {log.info("result is " + future.get());} catch (Exception e) {e.printStackTrace();} break;}}log.info("finish");}}

注意事項(xiàng)

1、使用注意

@Async只能使用到被代理的對(duì)象方法上,即代理類的入口方法處,且方法必須是public的。

2、事務(wù)處理機(jī)制

使用@Async異步注解不能和@Transaction事務(wù)注解在同一個(gè)方法上同時(shí)使用,不然事務(wù)注解將無(wú)效。

要使用事務(wù),需要把事務(wù)注解提取到方法里面的子方法上。

?

總結(jié)

以上是生活随笔為你收集整理的Spring开启方法异步执行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。