[英]Apache Camel - Spring DSL - Pass String argument to bean method
[英]Apache Camel Spring XML - Bean method call from filename expression
我有以下處理文件(輸入)的 Apache Camel Spring XML 配置。 我嘗試在復制之前重命名文件(移動選項)。 我希望文件名包含一個字符串,該字符串是來自返回字符串 (getHash) 的 bean 的方法調用的結果。
阿帕奇駱駝版
<dependency>
<groupId>org.apache.camel</groupId>
<version>3.0.0</version>
<type>pom</type>
</dependency>
駱駝上下文.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Configures the Camel Context-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext id="camelContext-89c763e9" xmlns="http://camel.apache.org/schema/spring">
<route id="FileConsumption" shutdownRoute="Defer">
<from id="_from2" uri="file:/home/spool_in/?move=.done&moveFailed=.bad&fileName={bean:videoProcessor.getHash}.{file:name.ext}"/>
<bean
beanType="org.mediaprocessor.VideoProcessor" id="_videoProcessor" ref="videoProcessor"/>
</route>
</camelContext>
<bean id="videoProcessor" class="org.mediaprocessor.VideoProcessor" />
</beans>
我的文件組件(路由的第一個端點)有問題
<from id="_from2" uri="file:/home/matthieu/spool_in/?move=.done&moveFailed=.bad&fileName=${bean:videoProcessor.getHash}.{file:name.ext}"/>
Bean VideoProcessor.java
@Bean
public static String getHash(File file) throws NoSuchAlgorithmException, IOException {
//Use MD5 algorithm
MessageDigest md5Digest = MessageDigest.getInstance("MD5");
//Get the checksum
String checksum = getFileChecksum(md5Digest, file);
return checksum;
}
Apache Camel 似乎無法識別 videoProcessor bean 並引發以下異常:
Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route FileConsumption at: >>> Bean[] <<< in route: Route(FileConsumption)[From[file:/home/spool_in/?mo... because of bean, ref or beanType must be provided
...
Caused by: java.lang.IllegalArgumentException: bean, ref or beanType must be provided
at org.apache.camel.component.bean.DefaultBeanProcessorFactory.createBeanProcessor(DefaultBeanProcessorFactory.java:67)
at org.apache.camel.reifier.BeanReifier.createProcessor(BeanReifier.java:47)
at org.apache.camel.reifier.ProcessorReifier.makeProcessorImpl(ProcessorReifier.java:571)
at org.apache.camel.reifier.ProcessorReifier.makeProcessor(ProcessorReifier.java:537)
at org.apache.camel.reifier.ProcessorReifier.addRoutes(ProcessorReifier.java:250)
at org.apache.camel.reifier.RouteReifier.doCreateRoute(RouteReifier.java:384)
... 37 more
根據文檔:
最后,我們還可以使用 bean 表達式來調用一個 POJO 類,該類生成一些要使用的字符串輸出(或可轉換為字符串):
fileName="uniquefile-${bean:myguidgenerator.generateid}.txt"
https://camel.apache.org/manual/latest/file-language.html
關於我所缺少的任何想法? 謝謝!
更新:根據朱利安的回答,在“${bean:videoProcessor.getHash}”中添加了“$”符號(錯字):問題沒有解決(同樣的例外)
我不熟悉 Camel XML,因為我發現 Camel DSL 更易於閱讀和使用。 但是,在來自駱駝的文檔中,您提供的是${bean:myguidgenerator.generateid}
而您沒有在路線中使用“$”符號: fileName={bean:videoProcessor.getHash}
您還需要從文件擴展名中添加一個“$”符號。 ${file:name.ext}
我還復制了您的項目,並在進行了這些“$”更改后,應用程序在我這邊啟動。 但是,我相信您的實施存在更多問題,即使您開始實施它也不會達到您的預期。
這是我認為您的問題是:
fileName
使用該 bean getHash
將設置為您要使用的文件名的過濾器。 從你所說的來看,這不是你想要的。 uri="file:/home/matthieu/spool_in/?move=.done/${bean:videoProcessor.getHash}.${file:name.ext}
這是我的簡化版 VideoProcessor:
@Component
@Slf4j
public class VideoProcessor {
public void process(Exchange exchange) {
log.info("Processing {} video ", ((GenericFile) exchange.getIn().getBody()).getFileName());
}
public String getHash(File file) {
return FilenameUtils.removeExtension(file.getName()) + "_copy";
}
}
這是日志條目:
2020-01-03 11:19:50.444 INFO 27988 --- [/temp/spool_in/] c.v.t.g.webservice.camel.VideoProcessor : Processing Video_1.mpg video
2020-01-03 11:20:41.284 INFO 27988 --- [/temp/spool_in/] c.v.t.g.webservice.camel.VideoProcessor : Processing Video_2.mpg video
2020-01-03 11:20:53.342 INFO 27988 --- [/temp/spool_in/] c.v.t.g.webservice.camel.VideoProcessor : Processing Video_3.mpg video
以及移動的文件:
正如@julian 已經指出的那樣,您不能使用filename
選項來重命名文件。 此選項用於過濾要使用的文件。
因此,如果您想在處理文件之前重命名文件,例如,您可以創建一個“預處理”路由,它只是重命名文件並將它們交給真正的處理路由。
<route id="FileRenaming" shutdownRoute="Defer">
<from id="spool_in" uri="file:/home/spool_in/?move=.done&moveFailed=.bad"/>
<setHeader name="CamelFileName">
<simple>${bean:videoProcessor.getHash}.${file:name.ext}</simple>
</setHeader>
<to uri="file:/home/process/"/>
</route>
<route id="FileProcessing" shutdownRoute="Defer">
<from id="process" uri="file:/home/process/" />
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.