这是我一直在努力解决的问题...我正在使用 Camel (v2.10.2) 设置许多文件路由,以跨文件系统、服务器和进出组织 (B2B) 移动数据. 在它们各自的目录中有数据和信号文件,其中一些路由是短暂的,而另一些则作为服务在不同的虚拟机/服务器上运行。这些进程(路由)在不同的 unix '功能' id 下运行,但如果可能的话,会尝试使它们属于同一个 unix 组......
当然,在 unix 上,总是存在文件/目录权限问题的可能性……这就是我面临/试图解决的问题。
我通过检查中的自DefaultErrorHandler
定义使用和记录成功或失败进行交换。信号文件在成功时移动到目的地或在失败时移动到目录,同时将警报写入系统范围的警报日志(由 Tivoli 检查)RoutePolicy
onExchangeDone(...)
Exchange.isFailed()
.error
文件路由配置为通过consumer.bridgeErrorHandler=true
基本上,如果我有任何与 unix 权限相关的错误,那么我想停止(并可能删除)受影响的路线,清楚地表明这已经发生以及为什么 - 权限问题不容易以编程方式解决,所以停止和警报是唯一的选项。
所以我将说明一个导致问题的测试用例......
App_A 在./data/中创建一些数据文件。然后 App_A 在./signal/中创建相同数量的信号文件,但由于一些与“数据”相关的错误,它还会创建一个 没有相应数据文件的信号文件./signal/acc_xyz.csv 。
Route 开始处理./signal/acc_xyz.csv并且“验证过程”发现./data/acc_xyz.csv不存在并抛出异常以指示这一点,因此停止进一步处理交换。
该File
组件配置moveFailed=.error
为将信号文件移动到./signal/.error/,但是这个目录被锁定(不要担心为什么会这样)到执行 Java 进程的功能用户 ID,并且内部 Camel 处理会抛出一个GenericFileOperationFailedException
指示导致成为潜在的“权限被拒绝”问题。
哦,天哪,然后再次处理相同的信号文件,然后……
我试图将此“次要错误”传播到我的代码中,但失败了,因此我无法停止路由。
我怎样才能将这个和其他内部 Camel 错误传播到我的代码/异常处理程序/任何东西,而不仅仅是看到它被记录和吞下?
提前致谢
好的,来自 log4j 的更多详细信息...注意时间顺序
骆驼默认错误处理程序:
2013-04-25 15:06:26,001 [Camel (camel-1) thread #0 - file:///FTROOT/fileTransfer/outbound/signal] ERROR (MarkerIgnoringBase.java:161) - Failed delivery for (MessageId: ID-rwld601-rw-discoverfinancial-com-60264-1366902384246-0-1 on ExchangeId: ID-rwld601-rw-discoverfinancial-com-60264-1366902384246-0-2). Exhausted after delivery attempt: 1 caught: java.lang.IllegalStateException: missingFile: route [App_A.outboundReceipt] has missing file at /FTROOT/fileTransfer/outbound/data/stuff.log
java.lang.IllegalStateException: missingFile: route [App_A.outboundReceipt] has missing file at /FTROOT/fileTransfer/outbound/data/stuff.log
at com.myco.mft.process.BaseFileRouteBuilder.checkFile(BaseFileRouteBuilder.java:934)
我的警报记录器通过 RoutePolicy.onExchangeDone(...) - 在这个 pont 交换已完成但失败:
2013-04-25 15:06:26,011|Camel (camel-1) thread #0 - file:///FTROOT/fileTransfer/outbound/signal|exchange|App_A.outboundReceipt|signalFile=/FTROOT/fileTransfer/outbound/signal/stuff.log|there has been a routing failure|missingFile: route [App_A.outboundReceipt] has missing file at /FTROOT/fileTransfer/outbound/data/stuff.log
骆驼端点后处理 - 这是骆驼不传播给我的东西:
2013-04-25 15:06:26,027 [Camel (camel-1) thread #0 - file:///FTROOT/fileTransfer/outbound/signal] WARN (GenericFileOnCompletion.java:149) - Rollback file strategy: org.apache.camel.component.file.strategy.GenericFileDeleteProcessStrategy@104e28b for file: GenericFile[/FTROOT/fileTransfer/outbound/signal/stuff.log]
2013-04-25 15:06:28,038 [Camel (camel-1) thread #0 - file:///FTROOT/fileTransfer/outbound/signal] WARN (MarkerIgnoringBase.java:136) - Caused by: [org.apache.camel.component.file.GenericFileOperationFailedException - Error renaming file from /FTROOT/fileTransfer/outbound/signal/stuff.log to /FTROOT/fileTransfer/outbound/signal/.error/stuff.log]
org.apache.camel.component.file.GenericFileOperationFailedException: Error renaming file from /FTROOT/fileTransfer/outbound/signal/stuff.log to /FTROOT/fileTransfer/outbound/signal/.error/stuff.log
at org.apache.camel.component.file.FileOperations.renameFile(FileOperations.java:72)
...
Caused by: java.io.FileNotFoundException: /FTROOT/fileTransfer/outbound/signal/stuff.log (Permission denied)
at java.io.FileInputStream.open(Native Method)