我在处理器中抛出/捕获异常时阻止原始文件重命名时遇到了一些问题。
我有这样的路线:
<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文件库。许多路由使用此处理器。)
答案 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>