Я не очень хорошо знаком с функцией Spring Live Reload. Однако я заметил, что каждый раз, когда я сохраняю изменения в моем коде Java. Профили Java (JM C) или Eclipse (режим отладки) показывают, что поток, который я уже создал, был снова создан, что привело к 2 потокам (1 поток до перезагрузки + 1 поток после перезагрузки).
Я в настоящее время использую ThreadPoolExecutor
для создания моих потоков. в основном я позволяю Spring управлять моими потоками. В этом случае, как принудительно завершить работу / прервать потоки, которые я создал, когда происходит прямая перезагрузка?
введите описание изображения здесь
Ниже мой источник.
ApplicationThreadingConfiguration. java
@Configuration
public class ApplicationThreadingConfiguration {
private static final Logger logger = LoggerFactory.getLogger(ApplicationThreadingConfiguration.class);
@Autowired
MyProperties prop;
@Bean(name = "myThread")
public TaskExecutor taskExecutor() {
logger.info(prop.toString());
final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(prop.getCorePoolSize());
executor.setMaxPoolSize(prop.getMaxPoolSize());
executor.setQueueCapacity(prop.getQueueCapacity());
executor.setThreadNamePrefix("MyThread-");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.initialize();
return executor;
}
}
AppEventConfiguration. java (это порождает мой поток после загрузки контекста Spring)
@Configuration
public class AppEventConfiguration {
private static final Logger logger = LoggerFactory.getLogger(AppEventConfiguration.class);
@Autowired
private MyService service;
@Autowired
private ApplicationContext context;
@Autowired
@Qualifier("myThread")
private TaskExecutor executor;
@EventListener(ApplicationReadyEvent.class)
public void onApplicationReadyEvent() {
service.getSomethingFromDB().stream().forEach(dto -> {
logger.info("Id: {}", dto.getId());
MyRunnableThread t = this.context.getBean(MyRunnableThread.class);
t.setMyId(dto.getId());
executor.execute(t);
});
}
}
MyRunnableThread. java
@Component
@Scope("prototype")
public class MyRunnableThread implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(MyRunnableThread.class);
private long myId;
@Override
public void run() {
while(true) {
try {
logger.info("Do something here on ID: {}",this.myId);
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void setMyId(long id) {
this.myId = myId;
}
}
myproperties.properties
myprop.core-pool-size=80
myprop.max-pool-size=100
myprop.queue-capacity=100