2016-04-02 5 views
2

У меня есть следующий в моем основном методе:Почему не мой shutdownhook в моем основном методе называется?

public static void main(String[] args) throws IOException { 
    Properties properties = getConfig(); 
    Jedis jedis = configure(properties) 

    jedis.subscribe(queueHandler, "queue"); 

    Runtime.getRuntime().addShutdownHook(new Thread() { 
     @Override 
     public void run() { 
      logger.debug("SHUTTING DOWN"); 
      jedis.close(); 
     } 
    }); 
} 

Я заметил, что код внутри моего отключение крючка не запуская, почему это? Как очистить ресурсы, которыми обладает мой основной метод?

+0

Как проверить, если ваш выключение крючок был запущен? Если логгер закрыт другим крючком выключения перед вашим, он, вероятно, не сможет зарегистрировать ваше сообщение. – Basilevs

+0

Я думаю, что вам нужен System.exit в вашем коде для запуска выключения. – RubioRic

ответ

0

Ключ выключения вызовет, если jvm выключится. Убедитесь, что программа завершена. Если jedis работает в фоновом режиме (в потоке), даже если последний оператор выполняется, крюк выключения не будет вызываться. В таком случае вам нужно остановить этот поток. Лучший способ - попробовать jedis.shutdown(); (после добавления к нему выключения, здесь как последнего оператора), чтобы закрыть его.

1

«Обратите внимание, что подписка - это операция блокировки ...» (от the AdvancedUsage wiki).

Это, в свою очередь, означает, что закрытие крюк регистрируется только после того, как вы отказаться от подписки или выключения Jedis, и вы, вероятно, только достичь той части кода, когда JVM уже завершает работу (в этом случае вновь добавленный выключение крюк игнорируется: крючки остановки должны быть зарегистрированы до остановки JVM).

«Дополнительные примеры использования проверяют тесты». (от main Github page)

Итак, давайте посмотрим на PublishSubscribeCommandsTest.
Тест - это всего лишь одна операция подписки, но в рамках операции подписки JedisPubSub не подписывается, когда получает определенное сообщение, тем самым разблокируя себя, чтобы тест мог завершиться.

Две вещи, которые вы можете экспериментировать с:

  • зарегистрировать выключение крючок перед вызовом jedis.subscribe
  • Скопируйте код из теста и изменить его, так что вы можете экспериментировать с блокировкой и разблокирование нити и выключая Jedis из в пределах отключения крюка (чтобы очистить используемые ресурсы)
0

Регулярный выход Main-метод немного отличается от явного вызова System.exit(0);

так, попробуйте следующее:

public static void main(String[] args) throws IOException { 
    //all your code... 
    System.exit(0); //NOTE: non zero status will work different! 
}