<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
我用以下测试检查了您的情况:
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库文件中,但没有成功。