Как запустить 2 независимых пула ExecutorService и выйти без отключения Spring? - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь реализовать базовую 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.

Есть предложения? Я чувствую, что упускаю что-то очевидное здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...