我正在使用 Camel File 组件来使用文件,如下所示:
<from uri="file:myDir?noop=true&filter=myFilter&scheduler=quartz2&scheduler.cron={{schedule}}/>
源位置是只读的。 Camel File documentation说,默认情况下它不会使用读锁定。
但是,我在运行此代码时收到了权限被拒绝的异常。
?端点[文件:// MYFILE过滤= myFilter&安培;幂等=真安培;空操作=真安培;调度= quartz2&安培; scheduler.cron = {{mySchedule}} 无法开始处理文件:GenericFile [myDir \ myFile]由于:Access 被拒绝。引起:[java.io.IOException - 访问被拒绝]
Stack Trace java.io.IOException:Permission denied at java.io.UnixFileSystem.createFileExclusively(Native Method)[:1.8.0_66] 在java.io.File.createNewFile(File.java:1012)[:1.8.0_66] at org.apache.camel.util.FileUtil.createNewFile(FileUtil.java:587)[org.apache.camel:骆驼核:2.15.1.redhat-621090 com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-LRU:1.4.2] 在 org.apache.camel.component.file.strategy.MarkerFileExclusiveReadLockStrategy.acquireExclusiveReadLock(MarkerFileExclusiveReadLockStrategy.java:71)[org.apache.camel:骆驼核:2.15.1.redhat-621090 com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-LRU:1.4.2] 在 org.apache.camel.component.file.strategy.GenericFileProcessStrategySupport.begin(GenericFileProcessStrategySupport.java:49)[org.apache.camel:骆驼核:2.15.1.redhat-621090 com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-LRU:1.4.2] 在 org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy.begin(GenericFileRenameProcessStrategy.java:35)[org.apache.camel:骆驼核:2.15.1.redhat-621090 com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-LRU:1.4.2] 在 org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:352)[org.apache.camel:骆驼核:2.15.1.redhat-621090 com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-LRU:1.4.2] 在 org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:211)[org.apache.camel:骆驼核:2.15.1.redhat-621090 com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-LRU:1.4.2] 在 org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:175)[org.apache.camel:骆驼核:2.15.1.redhat-621090 com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-LRU:1.4.2] 在 org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)[org.apache.camel:骆驼核:2.15.1.redhat-621090 com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-LRU:1.4.2] 在 org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)[org.apache.camel:骆驼核:2.15.1.redhat-621090 com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-LRU:1.4.2] 在 org.apache.camel.pollconsumer.quartz2.QuartzScheduledPollConsumerJob.execute(QuartzScheduledPollConsumerJob.java:59)[org.apache.camel:骆驼quartz2:2.15.1.redhat-621090] 在 org.quartz.core.JobRunShell.run(JobRunShell.java:202)[org.quartz调度器:石英:2.2.1] 在 org.quartz.simpl.SimpleThreadPool $ WorkerThread.run(SimpleThreadPool.java:573)[org.quartz调度器:石英:2.2.1]
从堆栈跟踪中可以看出,camel正在尝试创建 readLock ,并且由于缺少权限而导致异常。
所以,我的问题是
更新
我尝试按照其中一个答案的建议将readLockMarkingFile
设置为false
,但这并没有解决问题。因此,我明确将readLock
设置为none
。现在,它正在发挥作用。不知道,为什么readLock
默认情况下不是none
,如文档中所述。
答案 0 :(得分:2)
readLock-option仅决定camel是否会尝试获取文件的独占读锁定。还有一个名为&#34; readLockMarkerFile&#34;默认为true,将该选项设置为false,你应该没问题。
<from uri="file:myDir?noop=true&filter=myFilter&scheduler=quartz2&scheduler.cron={{schedule}}&readLockMarkerFile=false/>
答案 1 :(得分:0)
虽然这不直接回答你的问题,但我使用了文件监视器查找的触发器文件(0字节)。然后,您的路由将适用于触发器作为伴侣的实际文件。触发器文件被移动到子目录/parent/.camel,因此它不会再次处理。虽然我们已经注意到路由尝试在分布式环境中“拾取”实际文件,其中有多个服务器在运行该路由。
答案 2 :(得分:0)
我也遇到了这个问题,文档指出该参数的默认值为none
,但实际上使用的是markerFile
。要解决此问题,您必须显式指定此参数readLock=none
(camel-version 2.20.2)