[英]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)
在上述情況下,我一直在追問
RouterBuilder
類型中划分功能是否是一種好習慣? UnitOfWork
來解決異常策略嗎? RouteBuilder
類型,Camel是否可以通過某種方式調用我的自定義處理程序? 編輯我不能只擁有一個RouterBuilder
。
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中定義的路由構建器之間重用錯誤處理。
BaseRouteBuilder和InboxRouteBuilder和OrderRouteBuilder
您可以創建一個用於設置上下文范圍的錯誤配置的基類。然后,RouteBuilder類將擴展此基類並調用調用super.configure以獲得通用配置。
在單個RouteBuilder
擁有所有路由時,看看它是否RouteBuilder
。 像您這樣的“全局”異常處理程序並不是真正的全局處理程序,因為它們應用於該特定生成器構建的所有路由,因此,我不希望將onException
應用於REST路由。
或者,將onException
移到REST構建器中。 該處理程序設置HTTP狀態代碼,因此從表面上看,最好將其與REST路由打包在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.