如何在进程中抛出异常时阻止在Camel中重命名文件?

时间:2016-08-25 18:08:21

标签: java apache-camel

我在处理器中抛出/捕获异常时阻止原始文件重命名时遇到了一些问题。

我有这样的路线:

<route customId="true" id="localRoute">
    <from uri="{{ftp.pull.LOCAL.server}}" />
    <process ref="Processor" />
    <to uri="{{ftp.push.LOCAL.route}}" />
</route>

from URI包含以下选项:&move=${file:name.noext}.${file:name.ext}.old

在我的过程中,我阻止Exchange在某些条件下被路由到最终并且还抛出我使用的异常:

<onException>
    <exception>com.myException.ThrownException</exception>
    <handled><constant>true</constant></handled>
</onException>

如果我抛出并捕获该异常,是否有任何方法可以阻止重命名原始文件?

(我抛出并捕获该异常,以防止文件进入其他路径的Idempotent文件库。许多路由使用此处理器。)

2 个答案:

答案 0 :(得分:0)

除非您删除<handled>或将其标记为false,否则将重命名文件。

如果您处理异常,它将不会传播,并且您的文件组件认为Camel交换已成功处理,并且它将重命名该文件。

答案 1 :(得分:0)

所以我想我可能找到了答案。

所以我发现通过执行捕获我的自定义Exception的全局<onException>块,它将阻止记录堆栈跟踪并在文件名中输入使用Idempotent的路径的文件名文件存储库。但是,该全局块不会阻止重命名文件的路由重命名文件。

为了捕获Exception并阻止在重命名文件的路由上记录堆栈跟踪,我需要使用doTry / doCatch块。我必须做这样的事情:

<route customId="true" id="localRoute">
    <from uri="{{ftp.pull.LOCAL.server}}" />
    <doTry>
        <process ref="Processor" />
        <doCatch><exception>com.myException.ThrownException</exception></doCatch>
    </doTry>
    <to uri="{{ftp.push.LOCAL.route}}" />
</route>

所以我的解决方案看起来像这样:

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <onException>
        <exception>com.myException.ThrownException</exception>
        <handled><constant>true</constant></handled>
    </onException>
    <route customId="true" id="localRoute">
        <from uri="{{ftp.pull.LOCAL.server}}" />
        <doTry>
            <process ref="Processor" />
            <doCatch><exception>com.myException.ThrownException</exception></doCatch>
        </doTry>
        <to uri="{{ftp.push.LOCAL.route}}" />
    </route>
    <route customId="true" id="otherRoute">
        <from uri="{{ftp.pull.OTHER.server}}" />
        <setHeader headerName="otherFileRepoKey">
            <simple>${file:name}-${file:modified}</simple>
        </setHeader>
        <idempotentConsumer messageIdRepositoryRef="otherFileStore">
            <header>otherFileRepoKey</header>
            <process ref="Processor" />
            <to uri="{{ftp.push.OTHER.route}}"/>
        </idempotentConsumer>
    </route>
</camelContext>