Я пытаюсь реализовать базовую c комбинацию «производитель / потребитель»:
ExternalStream -> ExecutorService (ProducerPool) -> ArrayBlockingQueue -> ExecutorService (ConsumerPool) -> ExternalDestination
У меня есть много таких объектов с двумя пулами, давайте назовем их ShardConsumer.
-> ShardConsumer1 ->
ExternalStream -> ShardConsumer2 -> ExternalDestination
-> ShardConsumer3 ->
Мой вопрос находится в моем классе "Main", точке входа для приложения. Я хочу сделать что-то вроде этого:
public void run() {
this.shardConsumers = this.shardConsumerFactory.createShardConsumers()
final Thread shutdownHook = new Thread(name) {
@Override
public void run() {
for (ShardConsumer shardConsumer : shardConsumers) {
shardConsumer.shutdown();
}
}
};
Runtime.getRuntime().addShutdownHook(shutdownHook);
for (ShardConsumer shardConsumer : shardConsumers) {
shardConsumer.start();
}
}
Моя проблема в том, если я сделаю это затем метод run () завершается, и Spring начинает разрушать мои компоненты. Я в замешательстве, потому что мои потоки, не являющиеся демонами в ExecutorService, остаются в рабочем состоянии, как и предполагалось, но Spring теперь уничтожил мои компоненты зависимостей ExternalStream и ExternalDestination, так что все терпит неудачу.
Как удержать пружину от остановки до ее прерывания?
Пока что мое единственное решение - добавить:
try {
while (true) {
Thread.sleep(1000);
}
} catch (InterruptedException e) {
for (ShardConsumer shardConsumer : shardConsumers) {
shardConsumer.shutdown();
}
}
в конце, но мне действительно не нравится l oop.
Есть предложения? Я чувствую, что упускаю что-то очевидное здесь.