簡體   English   中英

Apache Camel-使用多個RouteBuilder進行異常處理

[英]Apache Camel - Exception handling with multiple RouteBuilders

我正在使用Apache Camel來實現Rest API。 我有2種RouteBuilder類型定義了我的應用程序需要的所有駱駝路線。 所有REST端點都駐留在RestRouter ,並使用CustomRouter框架執行。 例如,我有RestRouter來保存我的REST路由

public class RestRouter extends RouteBuilder
{
    @Override
    public void configure() throws Exception
    {
        rest("/sample")
                .post()
                .route()
                .routeId("postSample")
                .to("direct:validate")
                .to("direct:save")
                .endRest();
    }
}

另一個名為CustomRouter RouteBuilder捆綁了非REST路由。

public class CustomRouter extends RouteBuilder
{

    @Override
    public void configure() throws Exception
    {
        onException(ValidationException.class)
                .handled(true)
                .setBody(simple("${exchangeProperty[CamelExceptionCaught]}"))
                .to("bean:exceptionHandler?method=constraintViolationHandler")
                .setHeader(Exchange.CONTENT_TYPE, constant(ErrorResponse.class.getName()))
                .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(HttpStatus.SC_BAD_REQUEST));

        validator()
                .type(Sample.class)
                .withBean("sampleValidator");

        from("direct:validate")
                .to("bean-validator://x"); // Runs javax/Hibernate annotated validations

        from("direct:save")
                .routeId("saveSample")
                .inputTypeWithValidate(Sample.class)
                .to("bean:sampleRepository?method=save");
    }
}

驗證bean SampleValidator是一個Camel org.apache.camel.spi.Validator ,它會針對任何違規拋出org.apache.camel.ValidationException

設置問題是Camel不會為ValidationException調用我的自定義異常處理程序。 路由saveSample發生驗證異常。 這是我在駱駝處理器類型中如何進一步發展的發現。

  • 控制轉到RedeliveryErrorHandler's handleException() ,在其中查找異常策略。 交換失敗的根源(即RestRouter > postSample )可以在此處定義異常處理程序。
  • 后來,駱駝轉到失敗的UnitOfWork (即saveSample )來識別異常處理程序。
  • 這意味着,對於下面的表達式,routeId來自CustomRouter ,exceptionPolicy來自RestRouter 組合永遠不存在,並且Camel無法找到異常處理器。

    processor = exceptionPolicy.getErrorHandler(routeId)

在上述情況下,我一直在追問

  1. 在多個RouterBuilder類型中划分功能是否是一種好習慣?
  2. 駱駝不應該使用當前的UnitOfWork來解決異常策略嗎?
  3. 如果提供不同的RouteBuilder類型,Camel是否可以通過某種方式調用我的自定義處理程序?

編輯我不能只擁有一個RouterBuilder

  • 一個,因為我有一個Apache Avro對象進入有效負載以從另一個業務流程服務中發布,然后通過bean方法而不是使用Camel的Transformer來轉換到我的JPA實體。 這種安排與Camel調用Validator方式不匹配(請參見ContractAdvice )。 ContractAdvice是一個CamelInternalProcessorAdvice ,它應用Transformer (如果intype!= outtype)和Validator
  • 其次,轉移到單個RouterBuilder將需要我將Avro-to-Entity邏輯轉移到Camel Transformer ,並且該方法將與我們目前的工作方式大不相同。 但是可以,單個RouterBuilder + Transformer + Validator應該可以工作。

看一下Camel In Action中的這個示例,該示例演示了如何在Java DSL中定義的路由構建器之間重用錯誤處理。

BaseRouteBuilderInboxRouteBuilderOrderRouteBuilder

您可以創建一個用於設置上下文范圍的錯誤配置的基類。然后,RouteBuilder類將擴展此基類並調用調用super.configure以獲得通用配置。

在單個RouteBuilder擁有所有路由時,看看它是否RouteBuilder 像您這樣的“全局”異常處理程序並不是真正的全局處理程序,因為它們應用於該特定生成器構建的所有路由,因此,我不希望將onException應用於REST路由。

或者,將onException移到REST構建器中。 該處理程序設置HTTP狀態代碼,因此從表面上看,最好將其與REST路由打包在一起。

暫無
暫無

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

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