簡體   English   中英

處理集成流中可能發生的異常

[英]Handling exception that might occur in an integration flow

我有一個 REST controller 調用一個用@MessagingGateway(errorChannel = ERROR_CHANNEL)注釋的網關

這樣,網關啟動的集成流下游發生的任何錯誤都將流入錯誤通道,該通道將由另一個集成流處理,這按預期工作。

現在,還有另一種場景,集成流從 Kafka 讀取消息,將這些消息路由到另一個通道,另一個集成流處理這些消息,另一個流向遠程服務發送 HTTP 請求。

public IntegrationFlowBuilder attachmentEventTenantRouter(String tenantId) {
    return attachmentEventBaseFlow(".*")
            .filter(Message.class, m -> m.getHeaders().get(KafkaConstants.HEADER_PREFIX + MessageHeader.TENANT_ID_KEY) != null && m.getHeaders().get(KafkaConstants.HEADER_PREFIX + MessageHeader.TENANT_ID_KEY, String.class).equalsIgnoreCase(tenantId));
}

private IntegrationFlowBuilder attachmentEventBaseFlow(String eventRegex) {
    return IntegrationFlows
            .from(Kafka.messageDrivenChannelAdapter(kafkaListenerContainerFactory.createContainer(topic)).errorChannel(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME))
            .log(LoggingHandler.Level.DEBUG, "Inside Kafka Consumer")
            .filter(Message.class, m -> filter(m, eventRegex))
            .transform(messageToEventTransformer);
}

@Bean 
public IntegrationFlow kafkaConsumerFlow() {
    return fromKafkaFlowHelper.attachmentEventTenantRouter(TENANT_ID)
            .route(Message.class, m -> m.getHeaders().get(KafkaConstants.HEADER_PREFIX + MessageHeader.EVENT_TYPE_KEY, String.class), p -> p
                    .resolutionRequired(false)
                    .channelMapping("eventType", "transformMessagesFromKafkaAndPublishAnotherEvent")
                    .defaultOutputChannel("nullChannel"))
            .get();
}

@Bean
public IntegrationFlow transformMessagesFromKafkaAndPublishAnotherEvent() {
    return flow -> flow
            .transform(transformer)
            .handle( getKafkaHandler() );
}

@Bean
public IntegrationFlow sendHttpRequestToRemoteServiceFromKafkaEvent() {
    return flow -> flow
            .transform(transformer)
            .handle(gatewayCall, e -> e.advice(expressionAdvice()));
}

如何處理上述流程中可能發生的異常?

如您所見,我使用的是 ExpressionEvaluatingRequestHandlerAdvice,它為 handle 方法工作,但不確定如何處理轉換器中可能發生的異常?

當網關被 rest controller 調用時,配置了錯誤通道的按摩網關可以解決問題,但是當流程由 Kafka 消費者啟動時,我不知道如何實現這一點。

謝謝。

在 Artem 回應添加澄清后編輯

這是將請求發布到遠程服務的集成流的配置,並且在沒有 ExpressionEvaluatingRequestHandlerAdvice 的情況下,它的異常似乎不會被捕獲並路由到 errorChannel:

@Bean
public IntegrationFlow sendHttpRequestToRemoteServiceFromKafkaEvent() {
    return flow -> flow
            .transform(transformer)
            .handle(getOAuth2Handler(HttpMethod.PUT, "remote url"), e -> e.advice(expressionEvaluatingRequestHandlerAdvice));
}

private OAuth2RequestHandler getOAuth2Handler(HttpMethod httpMethod, String url) {
    return new OAuth2RequestHandler(oAuth2RestTemplate, httpMethod, url);
}

以及實現 MessageHandler 的 class OAuth2RequestHandler

@Override
public void handleMessage(org.springframework.messaging.Message<?> message) throws MessagingException {
    String requestBody = (String) message.getPayload();
    ResponseEntity<String> response = oAuth2RestTemplate.exchange(url, httpMethod, new HttpEntity<>(requestBody), String.class);
}

我看到您已經在 Kafka 消息驅動的通道適配器上使用了errorChannel() 那么,問題是什么?

這部分流程完全等同於提到的@MesaagingGateway及其errorChannel配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM