当前位置: 首页 > 知识库问答 >
问题:

具有多个异常的Camel重试控件

华展鹏
2023-03-14
<onException>
     <exception>my.exception.FooException</exception>
     <redeliveryPolicy maximumRedeliveries="10" redeliveryDelay="2000"
</onException>

<onException>
      <exception>my.exception.BarException</exception>
      <redeliveryPolicy maximumRedeliveries="2" redeliveryDelay="5000"
</onException>

Camel in Action的结尾是在时使用retry--这是获取我所要的控制的唯一方法吗?我需要创建一个知道每个异常计数的有状态bean吗?还是我忽略了一些简单的东西?我想确保当我接近这个重构时,我不会让我们走上一条丑陋的道路。

使用Camel 2.10.1


共有1个答案

况唯
2023-03-14

我用以下测试检查了您的情况:

import org.apache.camel.EndpointInject;
import org.apache.camel.Exchange;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

import java.util.concurrent.atomic.AtomicLong;

/**
 * @author Illarion Kovalchuk
 *         Date: 12/7/12
 *         Time: 2:58 PM
 */
public class Test extends CamelTestSupport
{

    private static final String MIDDLE_QUEUE = "seda:middle";

    @EndpointInject(uri = "mock:result")
    protected MockEndpoint resultEndpoint;

    @Produce(uri = "direct:start")
    protected ProducerTemplate template;

    private Processor processor = new Processor();

    @Test
    public void shouldRedeliverOnErrors() throws Exception
    {
        resultEndpoint.expectedBodiesReceived("Body");
        template.sendBodyAndHeader(MIDDLE_QUEUE, "Body", "Header", "HV");
        resultEndpoint.assertIsNotSatisfied();
    }

    @Override
    protected RouteBuilder createRouteBuilder()
    {
        return new RouteBuilder()
        {
            @Override
            public void configure() throws Exception
            {

                onException(FooException.class)
                        .redeliveryDelay(2000)
                        .maximumRedeliveries(10);

                onException(BarException.class)
                        .redeliveryDelay(5000)
                        .maximumRedeliveries(2);

                from(MIDDLE_QUEUE)
                        .bean(Processor.class, "process")
                        .to(resultEndpoint)
                        .end();
            }
        };
    }

    public static class Processor
    {
        private static AtomicLong retryState = new AtomicLong(0L);

        public static void process(Exchange e) throws FooException, BarException
        {
            long rs = retryState.getAndAdd(1L);
            if (rs < 4)
            {
                System.err.println("Foo Attempt "+ rs);
                throw new FooException();
            }
            if (rs == 4)
            {
                System.err.println("Bar Attempt "+ rs);
                throw new BarException();
            }
            System.err.println("Normal Attempt "+ rs);
        }
    }

    public static class FooException extends Throwable
    {
    }

    private static class BarException extends Throwable
    {
    }
}

结果,您的concirn被批准了:在BarException之后,交付尝试将耗尽,即使我们只有4个FooExceptions和1个BarException。

不幸的是,我现在不能回答你的问题,但我正在深入研究它,如果得到新的东西,我会更新我的unswer。

 类似资料:
  • 我正在使用JavaDSL来配置路由。我有一个类似于下面给出的路由。 在做了一些活动后,我该如何处理异常?在异常时,我尝试配置处理器和bean来重新引发异常。不管怎样,camel都在将异常设置为exchange,但没有破坏异常。 我在junit测试用例中这样做。我正在使用OneException处理器处理异常。在处理器内部,我正在进行断言。断言错误由camel自动处理,测试不会被标记为通过/失败。

  • 如何处理要报告多个问题的文件上的多个异常。 我有一个多处理步骤的情况,其中不同的异常可以发生(例如,它们将在以后异步)。我使用(可能是快速失败的反模式)异常列表,然后一旦他们完成并检查异常 我有自己定制的异常类别(针对每个异步任务)(扩展类),但实现了一个接口,以包含消息特定的键值对等附加信息 示例实现 我的问题是,如果我知道我在每个任务中创建这些异常对象时会遇到什么问题,但我不会抛出它们。但如果

  • 我是相当新的JNI善良,所以请告诉我,如果我是愚蠢的。 我试图将一个自定义异常从C扔到Java层,该层由字符串和整数构成。我无法让ThrowNew()工作,因为它只需要一个字符串参数。我能找到的每个自定义异常的例子都使用ThrowNew()!!Grrrrr 我猜我需要构造一个,并用“扔(jthrowable obj)”扔出去,但我不确定...这和“扔新()”一样吗?? 例如,这就是我需要的: 如果

  • 问题内容: 我的用户收到了很多OutOfMemoryError报告,每个报告都来自同一个Activity,其中包含MapView。我认为这是一个孤立的异常,仅在我的应用程序中只有一个位置,而且我无法弄清楚问题出在哪里。谁能给我一些指示为什么会这样吗? 我已针对此问题删除了一些不需要的代码,因此如果有人认为问题可能在于此,我将其发布。 堆栈痕迹 活动 十字线叠加 DUMPSYS MEMINFO 问题

  • 我正在尝试编写允许我做4件事的代码,我正在使用try和except。 代码如下: 但我还需要使用2个例外。你能给我解释一下我怎么做吗? 主要目标是下载一个文件;如果仍然没有,下载第二个文件,依此类推。

  • 我正在尝试为我的项目导入一些gradle依赖项。但是,特定包正在生成NoClassDefFound异常。如果我没有理解错的话,发生这种情况是因为包是在编译时找到的,而不是在运行时找到的。我在下面包含了我的分级构建以及生成的错误。我曾尝试手动将所需的jar添加到WAR库文件中,但没有成功。 我尝试手动将所需的jar添加到WAR库文件中,但没有成功。