【问题标题】:How to prevent renaming of file in Camel when Exception is thrown in Process?在进程中抛出异常时如何防止在骆驼中重命名文件?
【发布时间】:2016-08-27 01:27:36
【问题描述】:

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

我有这样的路线:

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

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

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

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

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

(我抛出并捕获该异常是为了防止文件进入其他路由的幂等文件存储库。许多路由都使用此处理器。)

【问题讨论】:

  • 如果不处理异常会怎样?如果抛出异常,它是否仍然重命名文件?
  • 如果我删除整个 onException 块,它不会重命名文件并将大错误消息打印到日志中
  • 您希望文件保留(您可以使用 moveFailed)仅将失败的文件移动到某处吗?您是否需要处理异常?换句话说:骆驼不会知道它失败了?
  • 我不希望文件移动到任何地方。基本上我在想我正在寻找的是相当于回滚,如果使用“移动”那么不要重命名文件,或者如果使用幂等文件回购不要将名称放入回购中。基本上就像这次没有轮询文件一样,如果这有意义吗?
  • 我认为问题出在手柄部分。如果您处理异常,我不确定是否会发生回滚。您可以不处理异常,而是尝试捕获,如果捕获异常,则只需记录或创建响应或其他内容。这应该可以防止重命名。

标签: java apache-camel


【解决方案1】:

除非您删除 &lt;handled&gt; 或将其标记为 false,否则文件将被重命名。

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

【讨论】:

  • 有没有办法避免堆栈跟踪,然后在我的日志中打印出来?因为我不时知道我抛出的这个异常会发生,所以我宁愿不打印大的堆栈跟踪。
【解决方案2】:

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

所以我发现,通过执行捕获我的自定义异常的全局 &lt;onException&gt; 块,它将阻止记录堆栈跟踪并将文件名输入到使用幂等文件存储库的路由的文件存储库中.但是该全局块不会阻止重命名文件的路由重命名文件。

为了捕获异常并防止在重命名文件的路由上记录堆栈跟踪,我需要使用 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多