Spring Boot@Async与@PostConstruct一起使用 编辑以获取解决方案

Spring Boot@Async与@PostConstruct一起使用 编辑以获取解决方案,spring,spring-boot,asynchronous,spring-annotations,Spring,Spring Boot,Asynchronous,Spring Annotations,这最终成为我的@Service类,具有多线程功能。它同时填充数据库中的每个表。此解决方案不再需要@Async注释或任务执行器 @服务 公共类AsyncDBLoad扩展线程{ 最终CovidDataServices服务; Thread.UncaughtExceptionHandler exceptionHandler=新线程。UncaughtExceptionHandler(){ @凌驾 public void uncaughtException(线程th,可丢弃的ex){ System.out.

这最终成为我的
@Service
类,具有多线程功能。它同时填充数据库中的每个表。此解决方案不再需要
@Async
注释或任务执行器

@服务
公共类AsyncDBLoad扩展线程{
最终CovidDataServices服务;
Thread.UncaughtExceptionHandler exceptionHandler=新线程。UncaughtExceptionHandler(){
@凌驾
public void uncaughtException(线程th,可丢弃的ex){
System.out.println(“未捕获异常:+ex.getMessage()
+“\n线程:”+th.getName());
}
};
公共AsyncDBLoad(CovidDataServices服务){
服务=服务;
}
@施工后
public void initializeAsyncDB()引发IOException、InterruptedException{
//线程来填充状态数据库
线程状态线程=新线程(){
@凌驾
公开募捐{
试一试{
service.populateDbWithStateData();
}捕获(中断异常| IOE异常){
System.out.println(“状态线程错误”);
}
}
};
//线程来填充国家数据库
线程countryThread=新线程(){
@凌驾
公开募捐{
试一试{
service.populateDBWithCountryData();
}捕获(中断异常| IOE异常){
System.out.println(“国家线程错误”);
}
}
};
//设置错误处理程序
setUncaughtExceptionHandler(exceptionHandler);
setUncaughtExceptionHandler(exceptionHandler);
//定名
setName(“状态线程”);
countryThread.setName(“国家线程”);
//启动线程
stateThread.start();
countryThread.start();
}
}
原始问题 我正在尝试在
@服务
中获得2个
@PostConstruct
方法,以使用
@Async

特别是在启动时,我填充DB表,这些表彼此独立,可以同时加载

我已经试着跟随,并让第一个
@PostConstruct
异步运行,但第二个方法仍然等待第一个方法完成后再开始

这是我目前的代码

应用程序启动:

2020-10-03 14:07:13.640  INFO 15974 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.38]
2020-10-03 14:07:13.687  INFO 15974 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-10-03 14:07:13.687  INFO 15974 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 544 ms
A
B
2020-10-03 14:07:14.018  INFO 15974 --- [           main] s.psotcons.PostConstructApp              : Started PostConstructApp in 1.046 seconds (JVM running for 1.341)
DONE B
DONE A
@springboot应用程序
@使能同步
公共类COVID19TRACKERV2应用程序{
公共静态void main(字符串[]args){
run(Covid19Trackerv2Application.class,args);
}
@豆子
公共执行者任务执行者(){
ThreadPoolTaskExecutor executor=新的ThreadPoolTaskExecutor();
执行器。setCorePoolSize(2);
执行器setMaxPoolSize(2);
执行器设置队列容量(500);
executor.setThreadNamePrefix(“GithubLookup-”);
executor.initialize();
返还执行人;
}
}
@Service
调用
@Async
方法:

@服务
公共类AsyncDBLoad{
最终CovidDataServices服务;
公共AsyncDBLoad(CovidDataServices服务){
服务=服务;
}
@施工后
public void initializeAsyncDB()引发IOException、InterruptedException{
service.populateDBWithCountryData();
}
@施工后
public void initializeAsyncDB2()引发IOException、InterruptedException{
service.populateDbWithStateData();
}
}
包含
@Async
方法的CovidDataServices
@Service
的相关部分:

@Async
public void populateDbWithStateData()引发IOException、InterruptedException{
System.out.println(“启动状态数据库填充”);
//填充数据库的部分代码,如果数据库为空,则大约需要15秒
System.out.println(“退出状态数据库填充”);
}
@异步的
public void populateDBWithCountryData()引发IOException、InterruptedException{
System.out.println(“起始国家数据库人口”);
//填充数据库的部分代码,如果数据库为空,则大约需要15秒
System.out.println(“出境国DB人口”);
}
启动的日志输出:

。\uuuuuuuuuuuu_
/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
'  |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
::弹簧靴::(v2.3.3.版本)
2020-10-03 10:29:50.222信息9636---[main]c.c.Covid19Trackerv2Application:在桌面AE0J8AT上用PID 9636启动Covid19Trackerv2Application(c:\Users\bhade\Documents\covid-19-trackerv2\build\classes\java\main由bhade在c:\Users\bhade\Documents\covid-19-trackerv2中启动)
2020-10-03 10:29:50.224信息9636---[main]c.c.covid19trackerv2应用程序:未设置活动配置文件,返回默认配置文件:默认
2020-10-03 10:29:50.636信息9636---[main].s.d.r.c.RepositoryConfigurationDelegate:在默认模式下引导Spring Data MongoDB存储库。
2020-10-03 10:29:50.677信息9636---[main].s.d.r.c.RepositoryConfigurationDelegate:Spring数据存储库扫描在37毫秒内完成。找到2个MongoDB存储库接口。
2020-10-03 10:29:51.352信息9636---[main]o.s.b.w.embedded.tomcat.TomcatWebServer:tomcat已用端口初始化:8080(http)
2020-10-03 10:29:51.361信息9636---[main]o.apache.catalina.core.StandardService:启动服务[Tomcat]
2020-10-03 10:29:51.361信息9636---[main]org.apache.catalina.core.StandardEngine:启动Se
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@SpringBootApplication
public class PostConstructApp {
    public static void main(String[] args) {      SpringApplication.run(PostConstructApp.class, args); }
    @Component
    @RequiredArgsConstructor
    class C {
        final MyService service;
        @PostConstruct
        void xx() {
            new Thread(service::a).start();
            new Thread(service::b).start();
        }
    }

    @Component
    class MyService {
        @SneakyThrows
        void a() {
            System.out.println("A");
            Thread.sleep(10000);
            System.out.println("DONE A");
        }
        @SneakyThrows
        void b() {
            System.out.println("B");
            Thread.sleep(5000);
            System.out.println("DONE B");
        }
    }
}
2020-10-03 14:07:13.640  INFO 15974 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.38]
2020-10-03 14:07:13.687  INFO 15974 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-10-03 14:07:13.687  INFO 15974 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 544 ms
A
B
2020-10-03 14:07:14.018  INFO 15974 --- [           main] s.psotcons.PostConstructApp              : Started PostConstructApp in 1.046 seconds (JVM running for 1.341)
DONE B
DONE A