camel是否对文件使用隐式读锁?

时间:2017-03-29 14:24:35

标签: java apache-camel readonly jbossfuse file-read

我正在使用 Camel File 组件来使用文件,如下所示:

<from uri="file:myDir?noop=true&amp;filter=myFilter&amp;scheduler=quartz2&amp;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 ,并且由于缺少权限而导致异常。

所以,我的问题是

  • 为什么camel使用锁定,即使读锁定的默认值为
  • 如果这是预期的行为,我如何从只有我没有写入权限的只读位置使用文件?

更新

我尝试按照其中一个答案的建议将readLockMarkingFile设置为false,但这并没有解决问题。因此,我明确将readLock设置为none。现在,它正在发挥作用。不知道,为什么readLock默认情况下不是none,如文档中所述。

3 个答案:

答案 0 :(得分:2)

readLock-option仅决定camel是否会尝试获取文件的独占读锁定。还有一个名为&#34; readLockMarkerFile&#34;默认为true,将该选项设置为false,你应该没问题。

<from uri="file:myDir?noop=true&amp;filter=myFilter&amp;scheduler=quartz2&amp;scheduler.cron={{schedule}}&amp;readLockMarkerFile=false/>

答案 1 :(得分:0)

虽然这不直接回答你的问题,但我使用了文件监视器查找的触发器文件(0字节)。然后,您的路由将适用于触发器作为伴侣的实际文件。触发器文件被移动到子目录/parent/.camel,因此它不会再次处理。虽然我们已经注意到路由尝试在分布式环境中“拾取”实际文件,其中有多个服务器在运行该路由。

答案 2 :(得分:0)

我也遇到了这个问题,文档指出该参数的默认值为none,但实际上使用的是markerFile。要解决此问题,您必须显式指定此参数readLock=none(camel-version 2.20.2)