Вертикали и неперехваченные исключения

Учитывая сценарий, когда одна из вершин выдает неперехваченное исключение.

Что происходит дальше? Если состояние вершины удалено из системы, существует ли какой-то механизм, аналогичный супервизорам erlang, для перезапуска вершины?

Документация не очень ясна в отношении этого аспекта.

Обновление на основе комментариев: Меня больше всего интересует ситуация, когда выбрасывается исключение из обработчиков полученного сообщения (через шину)

С уважением


person mhstnsc    schedule 22.06.2015    source источник
comment
Не могли бы вы уточнить, когда генерируется это исключение? Это во время развертывания? Во время обработки сообщения?...   -  person tmarwen    schedule 23.06.2015
comment
Я больше думал о времени обработки сообщений, но ваша точка зрения принята. Я также был бы заинтересован во время развертывания.   -  person mhstnsc    schedule 23.06.2015


Ответы (4)


Я ответил на часть своего вопроса (с помощью тестовой программы)

Когда в обработчике событий генерируется исключение, исключение перехватывается vert.x и проглатывается (игнорируется). Обработчик события обработает следующее сообщение.

Обновление: приложение может зарегистрировать обработчик исключений и доставить все неперехваченные Throwable этому обработчику. Там вы можете выполнить дополнительную общую обработку

Update2: используйте Vertx.exceptionHandler для регистрации обработчика

person mhstnsc    schedule 01.07.2015
comment
Как мы можем сделать это ? - person Navnath; 09.05.2019

Vert.x — это все тот же стиль, асинхронное программирование, которое в основном подчеркивается обработчиками обратных вызовов.

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

  • MainVerticle: ваша вершина развертывания (используется в основном для развертывания других вершин)
  • some.package.MyVerticle: ваша настоящая тема, обратите внимание, что здесь я использовал id, а не экземпляр.
public class MainVerticle extends AbstractVerticle {  
  public void start() {
    vertx.deployVerticle("some.package.MyVerticle", res -> {
      if (res.succeeded()) {
        // Do whatever if deployment succeeded
      } else {
        // Handle deployment failure here...
      }
    });
  }
}

Теперь, когда дело доходит до «сбоев обмена сообщениями», будет сложнее выделить конкретный случай, поскольку он может произойти во многих местах и ​​от имени обоих концов обмена сообщениями.

Если вы хотите зарегистрировать обработчик сбоя при отправке сообщения, вы можете создать экземпляр MessageProducer<T>, представляющий поток, в который он может быть записан, а затем зарегистрировать для него обработчик исключений:

EventBus eb = vertx.eventBus();
MessageProducer<String> sender = eb.sender("someAddress");
sender.exceptionHandler(e -> { 
  System.out.println("An error occured" + e.getCause()); 
});
sender.write("Hello...");

С другой стороны, вы можете обработать случай сбоя при чтении полученных сообщений почти таким же образом, но на этот раз используя MessageConsumer<T>:

EventBus eb = vertx.eventBus();
MessageConsumer<String> receiver = eb.consumer("someAddress");
receiver.exceptionHandler(e -> { 
  System.out.println("An error occured while readeing data" + e.getCause()); 
}).handler(msg -> {
  System.out.println("A message has been received: " + msg.body());
});
person tmarwen    schedule 24.06.2015
comment
@тмарвен. Ваш ответ охватывает некоторые темы, но не является полным, и отсутствующий случай интересует меня больше всего. Что произойдет, если в обработчике-потребителе возникнет исключение при обработке сообщения? Что делать, если System.out.println(сообщение получено: + msg.body()); выдает исключение? - person mhstnsc; 26.06.2015
comment
Что, если код в exceptionHandler снова выдаст исключение? - person mhstnsc; 26.06.2015

Чтобы добавить немного к предыдущему ответу, если вы хотите реагировать на все неперехваченные исключения, зарегистрируйте обработчик на объекте vertx следующим образом:

vertx.exceptionHandler(new Handler<Throwable>() {       
    @Override
    public void handle(Throwable event) {
        // do what you meant to do on uncaught exception, e.g.:
        System.err.println("Error");
        someLogger.error(event + " throws exception: " + event.getStackTrace());
    }
});
person stijena    schedule 22.09.2017

Я столкнулся с чем-то похожим на это. Когда возникает исключение как часть обработки сообщения в Verticle, я просто хотел ответить с помощью Exception.

Идея состоит в том, чтобы просто всплывать исключения вплоть до точки входа в приложение, где можно принять решение о том, что делать с ошибкой, попутно захватывая весь стек.

Для этого я написал эту функцию:

protected ReplyException buildReplyException(Throwable cause, String message)
    {
        ReplyException ex = new ReplyException(ReplyFailure.RECIPIENT_FAILURE, -1, message);
        ex.initCause(cause);
        return ex;
    }

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

reply -> {
    if (reply.succeeded()) {
        message.reply(true);
    } else {
        message.reply(buildReplyException(reply.cause(), ""));
    }
});

Таким образом, парень, который отправил исходное сообщение, получит ошибочный ответ, который содержит причину, которая является исключением, на котором заполнена полная трассировка стека.

Этот подход очень хорошо работал для меня при обработке ошибок при обработке сообщений.

person Juan Bustamante    schedule 01.11.2018