Apache Camel - 发生异常时延迟
Apache Camel - Delay when exception occurs
我写了一个 camel 路由来轮询一个文件夹,获取请求,检查服务器上的内存消耗(在 java 文件中)。如果它低于阈值,它会将请求丢弃到 JMS 队列中,否则它会抛出异常并再次选择它进行处理。
我需要做的是,当抛出异常时,我需要将处理延迟一段可配置的时间,比如 15 分钟。这将为服务器提供一些时间来稳定,而不是让它进行不必要的轮询。
我正在使用 camel 的 errorHandler 机制,但它似乎不起作用。 Camle 继续接听请求,没有任何延迟。请帮忙解决这个问题。
下面是包上下文快照:
<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>
您试过 redeliveryDelay
还是 redeliveryPolicyProfile
?
以下策略配置文件将重试 3 次,每次重试之间有 1000 毫秒的延迟。
<redeliveryPolicyProfile id="myRedeliveryProfile"
maximumRedeliveries="3"
redeliveryDelay="1000" allowRedeliveryWhileStopping="false"
retryAttemptedLogLevel="INFO" />
阅读更多关于here
通过在我的捆绑包上下文(上面显示的捆绑包上下文)中进行以下修改,重新交付策略开始生效并且似乎可以解决问题。
我写了一个 camel 路由来轮询一个文件夹,获取请求,检查服务器上的内存消耗(在 java 文件中)。如果它低于阈值,它会将请求丢弃到 JMS 队列中,否则它会抛出异常并再次选择它进行处理。
我需要做的是,当抛出异常时,我需要将处理延迟一段可配置的时间,比如 15 分钟。这将为服务器提供一些时间来稳定,而不是让它进行不必要的轮询。 我正在使用 camel 的 errorHandler 机制,但它似乎不起作用。 Camle 继续接听请求,没有任何延迟。请帮忙解决这个问题。 下面是包上下文快照:
<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>
您试过 redeliveryDelay
还是 redeliveryPolicyProfile
?
以下策略配置文件将重试 3 次,每次重试之间有 1000 毫秒的延迟。
<redeliveryPolicyProfile id="myRedeliveryProfile"
maximumRedeliveries="3"
redeliveryDelay="1000" allowRedeliveryWhileStopping="false"
retryAttemptedLogLevel="INFO" />
阅读更多关于here
通过在我的捆绑包上下文(上面显示的捆绑包上下文)中进行以下修改,重新交付策略开始生效并且似乎可以解决问题。