Весенняя живая перезагрузка для ThreadPoolExecutor - PullRequest
0 голосов
/ 20 июня 2020

Я не очень хорошо знаком с функцией 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...