如果我在路由处理交换之前删除文件,我会得到异常: GenericFileOperationFailedException:无法重命名文件。 PollEnrich试图将文件从someFolder移动到someFolder / .camel的策略。
from("wmq:queue:someQueue")//Here we get the message with information about the file
...//some logic
.pollEnrich("file:someFolder?fileName=someFile")
...//some logic
.choice()
.when(...)//Here we compare checksum from message with checksum of the file
.process(new SomeClassProcess)//And if they are different file will be deleted from someFolder
.otherwise()
.to(someAnotherFolder)
.end();
我正在尝试使用.rollback(“errorMessage”)
onException(RollbackExchangeException.class)
.log(LoggingLevel.WARN, "SomeExcptn");
from("wmq:queue:someQueue")
...//some logic
.pollEnrich("file:someFolder?fileName=someFile")
...//some logic
.choice()
.when(...)
.process(new SomeClassProcess)//it will delete someFile from someFolder
.rollback()
.otherwise()
.to(someAnotherFolder)
.end();
但是现在我在应用程序的日志中遇到了垃圾 - CamelExecutionException。 它有效,但你可以帮助解决它的方式吗?
P.S。我不知道在向pollEnrich提供URI之前是否需要删除文件,这就是为什么我不使用noop = true。在.otherwise()中,我需要将文件移动到.camel。
感谢您的建议!
答案 0 :(得分:1)
我认为您不需要使用任何处理器来删除文件。你可以这样做:
@Produce(uri = "direct:start")
ProducerTemplate producerTemplate;
@Autowired
CamelContext camelContext;
@Before
public void before() {
File outputDir = new File("transfer/outbox");
File tmpDir = new File("transfer/tmp");
for (File file : outputDir.listFiles())
file.delete();
for (File file : tmpDir.listFiles())
file.delete();
}
@Override
public RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("file:transfer/inbox?noop=true")
.to("file:transfer/tmp")
.pollEnrich("file:transfer/tmp")
.choice()
.when(header(Exchange.FILE_NAME).isEqualTo("Message1.txt"))
.log(LoggingLevel.ERROR, "${header[CamelFileName]} This file is discarded")
.otherwise()
.to("file:transfer/outbox")
.end();
}
};
}
@Test
public void smokeTest() throws Exception {
NotifyBuilder notifyBuilder = new NotifyBuilder(context)
.wereSentTo("file:transfer/outbox").whenDone(1)//Just to make the test enough time to complete
.create();
notifyBuilder.matches(5, TimeUnit.SECONDS);
File inputDur = new File("transfer/inbox/");
assertEquals(inputDur.listFiles().length, 2); // Message1.txt, Message2.txt (no .camel because ?noop=true)
File outputDir = new File("transfer/outbox/");
assertEquals(outputDir.listFiles().length, 1); // Message2.txt
File tmpDir = new File("transfer/tmp/");
assertEquals(tmpDir.listFiles().length, 1); // .camel
}
或者如果您不关心自己记录,更合适的方法是使用消息过滤器而不是基于内容的路由器:
from("file:/path/to/your/file")
.filter(somePredicate)
.to("file:/where/you/want/it/to/move")
在骆驼在机上交换中使用它时删除文件无法做什么,camel会使用.camelLock后面的另一个文件锁定文件,以防止其他路由消耗他,但是用处理器修改这个文件根本不安全。
另外,在你的例子中,我没有看到任何?noop = true。如果要删除或移动文件,使用?noop是无关紧要的。