Spring Обработка ошибок/исключений интеграции

Я начал работать с Spring Integration для отправки сообщений во внешнюю систему с использованием модели Spring Integration Google Pub/sub.

Я отправляю полезную нагрузку, полученную активатором службы, как показано ниже.

@ServiceActivator(inputChannel = "inputChannel")
              public void messageReceiver(final String payloadMessage) throws IOException {
    adapter.sendData(payloadMessage);  // send payloadMessage data to external system, add exception handlers
}

Я хочу реализовать обработку исключений для adapter.sendData(payloadMessage), чтобы я хотел рассмотреть различные сценарии, такие как

  1. Внешняя система не работает
  2. Проблемы с сетью при подключении к сети из моей системы во внешнюю систему.

Я следил за приведенной ниже облачной документацией Google и другой онлайн-документацией, но не найдено достаточного варианта использования для обработки вышеуказанных сценариев https://cloud.google.com/pubsub/docs/spring#using-spring-integration-channel-adapters

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

Я настроил канал ошибки ниже. Теперь в методе sendData() есть ошибка, я вижу те же сообщения об ошибках, которые продолжают загружаться в консоли eclipse. Есть ли необходимость добавить параметр spring.cloud.gcp.pubsub.subscriber.max-ack-extension-period в yaml

 @Bean
public PubSubInboundChannelAdapter messageChannelAdapter(final @Qualifier("myInputChannel") MessageChannel inputChannel,
        PubSubTemplate pubSubTemplate) 
{
    PubSubInboundChannelAdapter adapter = new PubSubInboundChannelAdapter(pubSubTemplate, pubSubSubscriptionName);
    adapter.setOutputChannel(inputChannel);
    adapter.setAckMode(AckMode.AUTO_ACK);
    adapter.setErrorChannelName("pubsubErrors");
    return adapter;
}

@ServiceActivator(inputChannel = "pubsubErrors")
public void pubsubErrorHandler(Message<MessagingException> exceptionMessage) {

    BasicAcknowledgeablePubsubMessage originalMessage = (BasicAcknowledgeablePubsubMessage) exceptionMessage
            .getPayload().getFailedMessage().getHeaders().get(GcpPubSubHeaders.ORIGINAL_MESSAGE);

    originalMessage.nack();
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вам нужна логика повторных попыток и отсрочек вокруг ваших исключений.

Дополнительную информацию см. в документах: https://docs.spring.io/spring-integration/reference/html/messaging-endpoints.html#message-handler-advice-chain.

У @ServiceActivator есть этот атрибут adviceChain для вашего рассмотрения.

tx, любой пример реализации, если он доступен, будет очень полезен. Почему вышеизложенное имеет много конфигурации xml?

learner-newfeatures 06.02.2023 16:14

Фреймворк изначально разрабатывался на XML DSL. Мы медленно работаем над добавлением фрагментов кода Java и других DSL в документы. См. пример Java DSL здесь: github.com/artembilan/microservices-patterns-spring-integrat‌​ion/…

Artem Bilan 06.02.2023 16:22

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

learner-newfeatures 06.02.2023 16:29

Нет, вам не нужно. Вы просили образец, и я показал вам самый близкий. Просто невозможно иметь образцы для каждого варианта использования.

Artem Bilan 06.02.2023 16:37

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

learner-newfeatures 06.02.2023 16:41

Я не уверен в вашем вопросе. Прежде всего, вы, вероятно, говорите о producersendData производит, а не потребляет. Если у вас нет исключения для этого sendData, то ваши данные, вероятно, передаются во внешнюю систему.

Artem Bilan 06.02.2023 17:20

позвольте мне прояснить вас, sendData() отправляет данные во внешнюю систему, которая в основном является вызовом обмена restAPI. Этот метод вызывается внутри кода подписчика (messagereciever() в данном случае является потребителем pubsub). Полезная нагрузка уже опубликована в очереди, которую обработал метод messageReciever() и отправляет во внешнюю систему с помощью метода sendData().

learner-newfeatures 06.02.2023 17:26

Вы, вероятно, можете просто повторно выдать исключение обратно в Pub/Sub и позволить ему удалить это сообщение, чтобы потребитель мог повторить его снова. Все еще не ясно, что вы хотели бы видеть, когда нет исключений...

Artem Bilan 06.02.2023 17:48

Хотелось бы видеть только в исключительных сценариях. Нет, когда нет исключений. Не могли бы вы дать ссылку, где я могу проверить, как удалить сообщение

learner-newfeatures 06.02.2023 17:53

Ну, учебник, которым вы делитесь в своем вопросе, имеет указатель на соответствующий тип: BasicAcknowledgeablePubsubMessage. Однако я считаю, что Pub/Sub автоматически делает nack, когда мы выбрасываем исключение.

Artem Bilan 06.02.2023 18:02

Я попытался настроить этот сценарий с помощью приведенной ниже документации. Я вижу, что журналы консоли продолжают печатать без остановки. cloud.spring.io/spring-cloud-static/spring-cloud-gcp/…

learner-newfeatures 07.02.2023 08:23

Я не знаю, что такое «консольные журналы» и что они продолжают печатать. Не могли бы вы поделиться дополнительной информацией? Например, EDIT в вашем вопросе было бы здорово

Artem Bilan 07.02.2023 14:33

Добавлен фрагмент кода, который вызывал повторную загрузку логов в консоли eclipse. На самом деле я использовал один и тот же входной канал для двух внешних вызовов Rest API. Есть ли способ, с помощью которого мы можем использовать один и тот же канал для отправки различных типов данных через конечные точки HTTP (GET, PUT, POST, DELETE) во внешние системы?

learner-newfeatures 07.02.2023 14:48

Вы не показываете какие логи. Вы можете использовать тот же канал, что и журнал, так как это PublishSubscribeChannel.

Artem Bilan 07.02.2023 15:11

Отсутствие подписки на один и тот же канал для двух разных внешних конечных точек от исполнителей служб вызывает обе конечные точки. Я пытаюсь вызвать только метод POST (sendData()), но другой исполнитель службы, который вызывает внешний метод deleteData(), также вызывается, поскольку оба они подписаны на один и тот же канал. Нужно ли мне создавать новые отдельные каналы для разных вызовов разных методов http?

learner-newfeatures 07.02.2023 16:26

Если ваш inputChannel — это DirectChannel, то вы обречены: по умолчанию он работает в циклическом режиме. Если вы хотите отправить одно и то же сообщение нескольким подписчикам, то PublishSubscribeChannel для вас. Пожалуйста, подумайте о том, чтобы поднять новый вопрос SO, поскольку он уже выходит за рамки исходной темы.

Artem Bilan 07.02.2023 16:43

Я создал новый ТАК вопрос stackoverflow.com/questions/75377542/…

learner-newfeatures 07.02.2023 19:31

Другие вопросы по теме