java spring启动和终止_如何在Spring-Boot中启动(并最终停止)守护程序线程?

我正在编写一个Spring-Boot应用程序来监视目录并处理正在添加到其中的文件 . 我通过在 Application 类中创建一个ApplicationRunner来启动一个线程,该类调用一个用 @Async 注释的方法:

@SpringBootApplication

@EnableAsync

public class Application {

@Autowired

private DirectoryMonitorService directoryMonitorService;

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

@Bean

public ApplicationRunner startDirectoryMonitorService() {

return args -> directoryMonitorService.monitorSourceDirectoty();

}

}

以下是 DirectoryMonitorService 的代码,其中包含使用 @Async 注释的方法:

@Service

public class DirectoryMonitorService {

private static final Logger logger = LogManager.getLogger(DirectoryMonitorService.class);

@Value("${timeout}")

private long timeout;

@Autowired

private WatchService watchService;

@Async

public void monitorSourceDirectoty() {

while (true) {

WatchKey watchKey;

try {

watchKey = watchService.poll(timeout, TimeUnit.SECONDS);

} catch (ClosedWatchServiceException | InterruptedException e) {

logger.error("Exception occured while polling from source file", e);

return;

}

// process the WatchEvents

if (!watchKey.reset()) {

break;

}

}

}

}

public class AsyncConfig extends AsyncConfigurerSupport {

private static final Logger logger = LogManager.getLogger(AsyncConfig.class);

private static final String THREAD_NAME_PREFIX = "Parser-";

@Value("${corePoolSize}")

public int corePoolSize;

@Value("${maxPoolSize}")

public int maxPoolSize;

@Value("${queueCapacity}")

public int queueCapacity;

@Override

public Executor getAsyncExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

executor.setCorePoolSize(corePoolSize);

executor.setMaxPoolSize(maxPoolSize);

executor.setQueueCapacity(queueCapacity);

executor.setThreadNamePrefix(THREAD_NAME_PREFIX);

executor.initialize();

return executor;

}

@Override

public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

return (Throwable ex, Method method, Object... params) -> {

logger.error("Exception message - " + ex.getMessage());

logger.error("Method name - " + method.getName());

for (Object param : params) {

logger.error("Parameter value - " + param);

}

};

}

}

不知怎的,我觉得这不是启动主线程最优雅的方式 . 有人有更好的解决方案吗?

另外,我宁愿将 while (true) 替换为 Boolean 变量,当Spring-Boot关闭时,我可以将其设置为false . 有谁知道我需要为此实现哪个接口?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值