Я начал работать с 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), чтобы я хотел рассмотреть различные сценарии, такие как
Я следил за приведенной ниже облачной документацией 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();
}




Похоже, вам нужна логика повторных попыток и отсрочек вокруг ваших исключений.
Дополнительную информацию см. в документах: https://docs.spring.io/spring-integration/reference/html/messaging-endpoints.html#message-handler-advice-chain.
У @ServiceActivator есть этот атрибут adviceChain для вашего рассмотрения.
Фреймворк изначально разрабатывался на XML DSL. Мы медленно работаем над добавлением фрагментов кода Java и других DSL в документы. См. пример Java DSL здесь: github.com/artembilan/microservices-patterns-spring-integration/…
Нужно ли мне внедрять автоматический выключатель? Здесь не задействовано несколько микросервисов. Только вызов внешней системы от абонента(который получает сообщение из очереди)
Нет, вам не нужно. Вы просили образец, и я показал вам самый близкий. Просто невозможно иметь образцы для каждого варианта использования.
понял. Один из вопросов здесь заключается в том, как мы можем гарантировать, что данные отправляются от подписчика во внешнюю систему (после того, как это рабочее состояние от failur) после того, как будет выдано исключение.
Я не уверен в вашем вопросе. Прежде всего, вы, вероятно, говорите о producer — sendData производит, а не потребляет. Если у вас нет исключения для этого sendData, то ваши данные, вероятно, передаются во внешнюю систему.
позвольте мне прояснить вас, sendData() отправляет данные во внешнюю систему, которая в основном является вызовом обмена restAPI. Этот метод вызывается внутри кода подписчика (messagereciever() в данном случае является потребителем pubsub). Полезная нагрузка уже опубликована в очереди, которую обработал метод messageReciever() и отправляет во внешнюю систему с помощью метода sendData().
Вы, вероятно, можете просто повторно выдать исключение обратно в Pub/Sub и позволить ему удалить это сообщение, чтобы потребитель мог повторить его снова. Все еще не ясно, что вы хотели бы видеть, когда нет исключений...
Хотелось бы видеть только в исключительных сценариях. Нет, когда нет исключений. Не могли бы вы дать ссылку, где я могу проверить, как удалить сообщение
Ну, учебник, которым вы делитесь в своем вопросе, имеет указатель на соответствующий тип: BasicAcknowledgeablePubsubMessage. Однако я считаю, что Pub/Sub автоматически делает nack, когда мы выбрасываем исключение.
Я попытался настроить этот сценарий с помощью приведенной ниже документации. Я вижу, что журналы консоли продолжают печатать без остановки. cloud.spring.io/spring-cloud-static/spring-cloud-gcp/…
Я не знаю, что такое «консольные журналы» и что они продолжают печатать. Не могли бы вы поделиться дополнительной информацией? Например, EDIT в вашем вопросе было бы здорово
Добавлен фрагмент кода, который вызывал повторную загрузку логов в консоли eclipse. На самом деле я использовал один и тот же входной канал для двух внешних вызовов Rest API. Есть ли способ, с помощью которого мы можем использовать один и тот же канал для отправки различных типов данных через конечные точки HTTP (GET, PUT, POST, DELETE) во внешние системы?
Вы не показываете какие логи. Вы можете использовать тот же канал, что и журнал, так как это PublishSubscribeChannel.
Отсутствие подписки на один и тот же канал для двух разных внешних конечных точек от исполнителей служб вызывает обе конечные точки. Я пытаюсь вызвать только метод POST (sendData()), но другой исполнитель службы, который вызывает внешний метод deleteData(), также вызывается, поскольку оба они подписаны на один и тот же канал. Нужно ли мне создавать новые отдельные каналы для разных вызовов разных методов http?
Если ваш inputChannel — это DirectChannel, то вы обречены: по умолчанию он работает в циклическом режиме. Если вы хотите отправить одно и то же сообщение нескольким подписчикам, то PublishSubscribeChannel для вас. Пожалуйста, подумайте о том, чтобы поднять новый вопрос SO, поскольку он уже выходит за рамки исходной темы.
Я создал новый ТАК вопрос stackoverflow.com/questions/75377542/…
tx, любой пример реализации, если он доступен, будет очень полезен. Почему вышеизложенное имеет много конфигурации xml?