org.apache.camel.NoSuchBeanException 用于映射到路由的错误处理程序

org.apache.camel.NoSuchBeanException for error handler mapped to route

我有以下路线定义文件 (linehaul-routes.xml):

<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://camel.apache.org/schema/spring"
        xsi:schemaLocation="
            http://camel.apache.org/schema/spring
            http://camel.apache.org/schema/spring/camel-spring.xsd">

    <route id="route1" errorHandlerRef="myErrorHandler">
        <from uri="amqp:queue:DSMLH_consignment_event"/> <!-- AMQP queue to which I send messages to trigger the route !-->
        <to uri="https://pesho.free.beeceptor.com/"/> <!-- Returns http 500 !-->
    </route>
</routes>

我在同一目录中也有一个带有错误处理程序的文件 (linehaul-error-handlers.xml):

<errorHandlers>
    <errorHandler id="myErrorHandler" type="DefaultErrorHandler">
        <redeliveryPolicy maximumRedeliveries="5" redeliveryDelay="2000"/>
    </errorHandler>
</errorHandlers>

和application.properties

camel.context.name=testContext
camel.main.routes-include-pattern=classpath:routes/linehaul-routes.xml,classpath:routes/linehaul-error-handlers.xml

当我 运行 代码时,我得到以下堆栈跟踪

2022-04-27 19:44:53,657 ERROR [org.apa.cam.qua.mai.CamelMainRuntime] (Quarkus Main Thread) [{}] Failed to start application: org.apache.camel.FailedToCreateRouteException: Failed to create route route1 at: >>> To[https://pesho.free.beeceptor.com/] <<< in route: Route(route1)[From[amqp:queue:DSMLH_consignment_event] -> [T... because of No bean could be found in the registry for: myErrorHandler of type: org.apache.camel.ErrorHandlerFactory
    at org.apache.camel.reifier.RouteReifier.doCreateRoute(RouteReifier.java:240)
    at org.apache.camel.reifier.RouteReifier.createRoute(RouteReifier.java:74)
    at org.apache.camel.impl.DefaultModelReifierFactory.createRoute(DefaultModelReifierFactory.java:49)
    at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:868)
    at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:758)
    at org.apache.camel.impl.engine.AbstractCamelContext.doInit(AbstractCamelContext.java:2862)
    at org.apache.camel.quarkus.core.FastCamelContext.doInit(FastCamelContext.java:166)
    at org.apache.camel.support.service.BaseService.init(BaseService.java:83)
    at org.apache.camel.impl.engine.AbstractCamelContext.init(AbstractCamelContext.java:2568)
    at org.apache.camel.support.service.BaseService.start(BaseService.java:111)
    at org.apache.camel.impl.engine.AbstractCamelContext.start(AbstractCamelContext.java:2587)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:247)
    at org.apache.camel.quarkus.main.CamelMain.doStart(CamelMain.java:94)
    at org.apache.camel.support.service.BaseService.start(BaseService.java:119)
    at org.apache.camel.quarkus.main.CamelMain.startEngine(CamelMain.java:140)
    at org.apache.camel.quarkus.main.CamelMainRuntime.start(CamelMainRuntime.java:49)
    at org.apache.camel.quarkus.core.CamelBootstrapRecorder.start(CamelBootstrapRecorder.java:45)
    at io.quarkus.deployment.steps.CamelBootstrapProcessor$boot173480958.deploy_0(Unknown Source)
    at io.quarkus.deployment.steps.CamelBootstrapProcessor$boot173480958.deploy(Unknown Source)
    at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
    at io.quarkus.runtime.Application.start(Application.java:101)
    at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:103)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:67)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:41)
    at io.quarkus.runtime.Quarkus.run(Quarkus.java:120)
    at io.quarkus.runner.GeneratedMain.main(Unknown Source)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at io.quarkus.runner.bootstrap.StartupActionImpl.run(StartupActionImpl.java:103)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: org.apache.camel.NoSuchBeanException: No bean could be found in the registry for: myErrorHandler of type: org.apache.camel.ErrorHandlerFactory
    at org.apache.camel.support.CamelContextHelper.mandatoryLookup(CamelContextHelper.java:241)
    at org.apache.camel.model.errorhandler.ErrorHandlerHelper.lookupErrorHandlerFactory(ErrorHandlerHelper.java:82)
    at org.apache.camel.reifier.errorhandler.ErrorHandlerRefReifier.lookupErrorHandler(ErrorHandlerRefReifier.java:41)
    at org.apache.camel.reifier.errorhandler.ErrorHandlerRefReifier.createErrorHandler(ErrorHandlerRefReifier.java:35)
    at org.apache.camel.impl.DefaultModelReifierFactory.createErrorHandler(DefaultModelReifierFactory.java:65)
    at org.apache.camel.reifier.ProcessorReifier.wrapInErrorHandler(ProcessorReifier.java:745)
    at org.apache.camel.reifier.ProcessorReifier.wrapChannelInErrorHandler(ProcessorReifier.java:726)
    at org.apache.camel.reifier.ProcessorReifier.wrapChannel(ProcessorReifier.java:705)
    at org.apache.camel.reifier.ProcessorReifier.wrapChannel(ProcessorReifier.java:611)
    at org.apache.camel.reifier.ProcessorReifier.wrapProcessor(ProcessorReifier.java:607)
    at org.apache.camel.reifier.ProcessorReifier.makeProcessor(ProcessorReifier.java:854)
    at org.apache.camel.reifier.ProcessorReifier.addRoutes(ProcessorReifier.java:579)
    at org.apache.camel.reifier.RouteReifier.doCreateRoute(RouteReifier.java:236)
    ... 31 more

错误处理程序映射的路由有什么问题? (我的目标是让我的路由在http 500上重试几次)

Camel Quarkus 仅支持 'simple' XML 路由。您不能像使用 Camel Spring XML.

那样直接定义 bean

相反,您可以声明一个 CDI bean 并在 XML 中引用它。例如。

@Named("myErrorHandler")
public DefaultErrorHandlerBuilder createDefaultErrorHandler() {
    return new DefaultErrorHandlerBuilder()
            .maximumRedeliveries(5)
            .redeliveryDelay(2000);
}

然后您可以通过 route 标签上的 errorHandlerRef 引用该 bean。

<route id="route1" errorHandlerRef="myErrorHandler">