Я пишу приложение Spring-Boot для мониторинга файлов каталога и процессов, которые добавляются к нему. Я запускаю ветку, создав приложение -завод в моем приложении класс, который вызывает метод, аннотированный с @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();
}
}
< /code>
Вот код для DirectoryMonitorService < /code>, который имеет метод, аннотированный с @Async < /code>: < /p>
@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;
}
}
}
}
< /code>
Наконец, вот где я создаю Threadpooltaskexecutor: < /p>
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);
}
};
}
}
< /code>
Каким -то образом я чувствую, что это не самый элегантный способ запуска основного потока. У кого-нибудь есть лучшее решение? Кто -нибудь знает, какой интерфейс мне нужен для этого?
Подробнее здесь: https://stackoverflow.com/questions/409 ... pring-boot
Как начать (и в конечном итоге остановить) нить демона в пружине? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как запустить (и в конечном итоге остановить) поток демона в Spring-Boot?
Anonymous » » в форуме JAVA - 0 Ответы
- 49 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как запустить (и в конечном итоге остановить) поток демона в Spring-Boot?
Anonymous » » в форуме JAVA - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-