Apache camel Apache Camel:处理封装在GenericFileOperationFailedException中的unix文件权限错误

Apache camel Apache Camel:处理封装在GenericFileOperationFailedException中的unix文件权限错误,apache-camel,Apache Camel,这是我已经解决了一段时间的问题…我正在使用Camel(v2.10.2)设置许多文件路由,以便跨文件系统、服务器和组织内外(B2B)移动数据。在各自的dir中有数据和信号文件,其中一些路由是短期的,而其他路由则作为服务在不同的vm/服务器上运行。这些进程(路由)在不同的unix“功能”ID下运行,但有人试图使它们属于相同的unix组(如果可能的话) 当然,在unix上,总是有可能出现文件/dir权限问题……这就是我正在面临/试图解决的问题 我使用DefaultErrorHandler并通过onEx

这是我已经解决了一段时间的问题…我正在使用Camel(v2.10.2)设置许多文件路由,以便跨文件系统、服务器和组织内外(B2B)移动数据。在各自的dir中有数据和信号文件,其中一些路由是短期的,而其他路由则作为服务在不同的vm/服务器上运行。这些进程(路由)在不同的unix“功能”ID下运行,但有人试图使它们属于相同的unix组(如果可能的话)

当然,在unix上,总是有可能出现文件/dir权限问题……这就是我正在面临/试图解决的问题

我使用
DefaultErrorHandler
并通过
onExchangeDone(…)
中的自定义
RoutePolicy
记录交换的成功或失败,检查
exchange.isFailed()
。信号文件在成功时移动到目标位置,或在失败时移动到
.error
dir,并将警报写入系统范围的警报日志(由Tivoli检查)

文件路由配置为通过
consumer.bridgeErrorHandler=true

基本上,如果我有任何与unix权限相关的错误,那么我希望停止(或者删除)受影响的路由,清楚地表明这已经发生以及原因-权限问题不容易通过编程解决,因此停止并发出警报是唯一的选项

所以我将演示一个导致问题的测试用例

应用程序A在/data/中创建一些数据文件。然后,App_A在/signal/中创建了相同数量的信号文件,但由于一些与“数据”相关的错误,它还创建了一个没有相应数据文件的信号文件/signal/acc_xyz.csv

路由开始处理/signal/acc_xyz.csv,“验证过程”发现/data/acc_xyz.csv不存在,并抛出异常以指示此情况,从而停止进一步处理的交换

文件
组件配置了
moveFailed=.error
以将信号文件移动到/signal/.error/,但该目录被锁定(不用担心为什么会被锁定)对于执行Java进程和内部Camel处理的功能用户id,会抛出一个
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)
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)
通过RoutePolicy.OneExchangeDone(…)的我的警报记录器-在此端口,交换已完成,但出现故障:

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)
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)
Camel端点后处理-这是Camel不会传播给我的内容:

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)
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)

文件被一次又一次轮询,因为它未被移动,因此仍然存在于该位置。我想您必须获得路由(可能来自上下文)并从异常处理程序中调用stop方法。@U2one:这正是我想要做的,除了Camel似乎没有宣传包装IO权限问题的-我将称之为次要或内部-异常…这里有一个log4j错误跟踪-注意timesok不是v2.X中的一个功能,可能是v3.X中的一个功能…似乎是一个相当基本的功能,这是必需的。。。这里有更多信息……但在此期间,//URI文件需要设置
&consumer.exceptionHandler=#myExceptionHandler
——即使我读了无数遍,我还是错过了这个:(