2017-03-02 116 views
1

在文件组件处理到文件夹“yyyy/yyyy-x.zip”之后,是否有办法将名为'yyyy-x.zip'的文件移动?我认为以下几点:处理后的Apache Camel移动文件

from("file://directory?preMove=working&move=${${file:onlyname}.substring(0,3)}/${file:onlyname}&moveFailed=error") 
.doStuff(...); 

但我总是得到以下异常。

org.apache.camel.language.simple.types.SimpleIllegalSyntaxException: Unknown function: ${file:onlyname}.toString().subString(0,3) at location 0 ${${file:onlyname}.toString().subString(0,3)}/${file:onlyname} 
    at org.apache.camel.language.simple.ast.SimpleFunctionStart$1.evaluate(SimpleFunctionStart.java:107) 
    at org.apache.camel.builder.ExpressionBuilder$75.evaluate(ExpressionBuilder.java:1795) 
    at org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36) 
    at org.apache.camel.component.file.strategy.GenericFileExpressionRenamer.renameFile(GenericFileExpressionRenamer.java:37) 
    at org.apache.camel.component.file.strategy.GenericFileRenameProcessStrategy.commit(GenericFileRenameProcessStrategy.java:87) 
    at org.apache.camel.component.file.GenericFileOnCompletion.processStrategyCommit(GenericFileOnCompletion.java:127) 
    at org.apache.camel.component.file.GenericFileOnCompletion.onCompletion(GenericFileOnCompletion.java:83) 
    at org.apache.camel.component.file.GenericFileOnCompletion.onComplete(GenericFileOnCompletion.java:57) 
    at org.apache.camel.util.UnitOfWorkHelper.doneSynchronizations(UnitOfWorkHelper.java:104) 
    at org.apache.camel.impl.DefaultUnitOfWork.done(DefaultUnitOfWork.java:230) 
    at org.apache.camel.util.UnitOfWorkHelper.doneUow(UnitOfWorkHelper.java:65) 
    at org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:674) 
    at org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:629) 
    at org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:246) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:109) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) 
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:460) 
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:227) 
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:191) 
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175) 
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:102) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.apache.camel.language.simple.types.SimpleParserException: Unknown function: ${file:onlyname}.toString().subString(0,3) 
    at org.apache.camel.language.simple.ast.SimpleFunctionExpression.createSimpleExpression(SimpleFunctionExpression.java:230) 
    at org.apache.camel.language.simple.ast.SimpleFunctionExpression.createExpression(SimpleFunctionExpression.java:45) 
    at org.apache.camel.language.simple.ast.SimpleFunctionStart$1.evaluate(SimpleFunctionStart.java:104) 
    ... 27 common frames omitted 

编辑:

由于克劳斯易卜生的提示,我设法拿到了以下解决方案:

from("file://directory?preMove=working&move=${bean:myBean.myMethod(${file:onlyname})}&moveFailed=error") 
.doStuff(...); 

通过以下豆:

import org.springframework.stereotype.Service; 

@Service("myBean") 
public class MyBeanImpl() implements MyBean{ 

     @Override 
     public String myMethod(String fileName){ 
      return ...create the filename...; 
     } 
    } 

回答

2

你不能直接在uri中使用子串等复杂函数二。

您可以使用一个bean来计算名称,然后使用move=${bean:myBean.myMethod},然后在注册表中注册一个ID为myBean的bean,然后计算该名称。