Как получить потерянное соединение с сервером без перезапуска Сервера, когда поток слушателя умирает - PullRequest
2 голосов
/ 24 марта 2012

Я пытаюсь прослушать очередь RabbitMQ, опросив ее.Но почему-то из-за проблем с сетью, если однажды соединение с очередью потеряно, то поток молча умирает, и соединение и все закрывается.Но это фоновая задача, и мы не будем знать, пока очередь действительно не станет огромной, и начнем отправлять уведомления.

Может кто-нибудь помочь мне с постепенным отключением потока (что, я полагаю, я уже делаю, тщательно взявисключение в оговорке поймать).Но я не знаю, как перезапустить остановленный поток.

Есть ли способ, с помощью которого я могу перезапустить новый экземпляр остановленного потока.

PS: я создаю экземпляр потока с помощью @postconstruct и вызываю поток init вскоре после того, как контейнер загрузит все bean-компоненты.

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

Если вы правильно («изящно») обрабатываете исключение, тогда ваше соединение будет извлечено потоком ... просто поместите его в цикл true и продолжайте прослушивать очередь .. Как только сетевое соединение (и в конечном итоге соединение с очередью) будеттогда ваш поток получит соединение.

2 голосов
/ 24 марта 2012

Мне кажется, что вы не выполняете надлежащую обработку исключений. Вы говорите «поток молча умирает», но в Java этого не происходит. Я проверю ваши исключения и буду следить за следующими проблемами:

  • Остерегайтесь throws Exception метода. Это скрывает все виды зла. Метод обычно должен перечислять исключения, которые он выдает.
  • Если Исключение выдает слишком много различных типов исключений, это означает, что оно слишком велико. Попробуйте разделить его на несколько меньших методов. Или обработайте определенные исключения внутри метода и выбросьте одно исключение.
  • Старайтесь иметь небольшие блоки try / catch, которые по возможности ловят одно исключение. Не включайте огромные блоки кода с try { ... } catch (Exception e) { ... }. Это, опять же, скрывает зло.
  • Если вы поймали исключение, убедитесь, что вы не просто слепо продолжаете. Если это фоновый поток, то, возможно, он должен выйти или перезапустить сокет или ...
  • Убедитесь, что вы правильно сообщаете обо всех исключениях. Каждый блок catch должен что-то делать с исключением. e.printStackTrace() может работать, но предоставление дополнительной информации о проблеме обычно в порядке.

Но я не знаю, как перезапустить остановленный поток.

Вы не перезапускаете остановленный поток, вы запускаете другой. Если поток вообще не должен закрываться, то ему необходимо заново открыть сокет или, возможно, перезапустить соединение RabbitMQ. Опять же, речь идет о правильной обработке исключений. Я не знаю RabbitMQ, но может помочь что-то вроде следующего псевдокода:

public void run() {
    while (!shutdown) {
       Connection conn = null;
       try {
           conn = rabbitMq.start();
           processQueue(conn);
       } catch (IOException e) {
           // TODO: log the exception here
       } finally {
           // make sure we close the connection
           if (conn != null) { conn.close(); }
       }
       try {
          // we sleep here to not spin if the RabbitMQ host goes down
          Thread.sleep(1000);
       } catch (InterruptedException e) {
          Thread.currentThread.interrupt();
          // bail if someone interrupts us
          return;
       }
}

Удачи.

...