Apache camel ApacheCamel-发生异常时的延迟

Apache camel ApacheCamel-发生异常时的延迟,apache-camel,Apache Camel,我已经编写了一个camel路由,它轮询一个文件夹,接收请求,检查服务器上的内存消耗(在java文件中)。如果低于阈值,则将请求丢弃到JMS队列上,否则将抛出异常并再次拾取以进行处理 我需要做的是,当抛出异常时,我需要将处理延迟一段可配置的时间,比如15分钟。这将给服务器一些时间来稳定,而不是不必要地保持轮询。 我正在使用camel的errorHandler机制,但它似乎不起作用。卡米尔毫不迟疑地继续接受请求。请帮助解决这个问题。 以下是捆绑包上下文快照: <camel:onExceptio

我已经编写了一个camel路由,它轮询一个文件夹,接收请求,检查服务器上的内存消耗(在java文件中)。如果低于阈值,则将请求丢弃到JMS队列上,否则将抛出异常并再次拾取以进行处理

我需要做的是,当抛出异常时,我需要将处理延迟一段可配置的时间,比如15分钟。这将给服务器一些时间来稳定,而不是不必要地保持轮询。 我正在使用camel的errorHandler机制,但它似乎不起作用。卡米尔毫不迟疑地继续接受请求。请帮助解决这个问题。 以下是捆绑包上下文快照:

<camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy backOffMultiplier="500" />
        <camel:log message="Default error handler was called"></camel:log>
    </camel:onException>
            <camel:route>
                <!--  Reading from REST url -->
                <camel:from uri="<my url>" />
                <!--  If else loop -->
                <camel:choice>
                    <camel:when>
                        <camel:xpath>Some path</camel:xpath>
                        <!--  Parsing OrderNumber and OrderVersion-->
                        <camel:log message="Recieved request ${headers.OrderNumber}-${headers.OrderVersion}.xml"/>
                        <camel:setHeader headerName="OrderNumber">
                            <xpath>Some path</xpath>
                        </camel:setHeader>
                        <camel:setHeader headerName="OrderVersion">
                            <camel:xpath>Some path</camel:xpath>
                        </camel:setHeader>
                        <!-- Request being put in file folder -->
                        <to
                            uri="file:data/inbox?fileName=${header.OrderNumber}-${header.OrderVersion}.xml"
                            pattern="InOut" />
                    </camel:when>
                    <!--  For all other requests put on  queue -->
                    <camel:otherwise>
                        <camel:log message="Request ${headers.OrderNumber}-${headers.OrderVersion}.xml directly sent to  queue"/>
                            <to uri="my queue"
                                pattern="InOut" />
                    </camel:otherwise>
                </camel:choice>
            </camel:route>
            <camel:route errorHandlerRef="errorHandler">
            <!-- Route to put message from folder to JMS queue if memory consumption is below limit-->
                <camel:from uri="file:data/inbox"/>
                    <camel:process ref="checkMemoryConsumption"/>
                    <camel:convertBodyTo type="String" />
                    <camel:log message="Sucessfully processing service order ${headers.OrderNumber}-${headers.OrderVersion}.xml"/>
                    <to uri="my queue"
                            pattern="InOut" />
            </camel:route>

java.lang.Exception
某条路
某条路
某条路

您是否尝试了
重新交付policyprofile
重新交付版本

下面的策略配置文件将重试3次,每次重试之间的延迟为1000毫秒

<redeliveryPolicyProfile id="myRedeliveryProfile"
        maximumRedeliveries="3"
        redeliveryDelay="1000" allowRedeliveryWhileStopping="false"
        retryAttemptedLogLevel="INFO" />


通过在我的捆绑包上下文(上面显示的捆绑包上下文)中进行以下修改,阅读更多关于

的内容,重新交付策略开始生效,似乎起到了作用。

如果出现错误,您可以使用Backoff乘数在稍后进行投票-正如克劳斯所指出的那样,使用Backoff乘数。谢谢您的建议。我添加了一个异常处理,并尝试在其中配置backoffMultiplier,但仍然遇到相同的问题。投票无休止地进行,毫不拖延。java.lang.Exception。我也发布了更新的捆绑包上下文。请让我知道我在这里遗漏了什么。不,关于消费者,请参阅@Claus Ibsen-是不是maximumRedeliveries和redeliveryDelay齐头并进?正如您在我的案例中所看到的,我希望对请求进行轮询,直到其成功处理,并且没有在我的路线中指定最大重新交付,只有延迟。然而,由于这种延迟机制也不起作用。只有当我定义maximumRedeliveries和redeliveryDelay时,延迟才生效。我尝试了redeliveryPolicy“骆驼:redeliveryPolicy”。我犯的错误是,我没有包括“maximumRedeliveries”,因为在我的案例中,我希望重试,只要请求没有得到处理,并且没有特定的次数。现在,我已经添加了这个标签,它似乎工作。谢谢你的建议。