1

我有以下处理文件(输入)的 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&amp;moveFailed=.bad&amp;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&amp;moveFailed=.bad&amp;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}”中添加了“$”符号(错字):问题没有解决(同样的例外)

4

2 回答 2

0

正如@julian 已经指出的那样,您不能使用filename重命名文件的选项。此选项用于过滤要使用的文件。

因此,如果您想在处理文件之前重命名文件,例如,您可以创建一个“预处理”路径,它只是重命名文件并将它们交给真正的处理路径。

<route id="FileRenaming" shutdownRoute="Defer">
    <from id="spool_in" uri="file:/home/spool_in/?move=.done&amp;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/" />
    ...
于 2020-01-07T09:10:31.960 回答
0

我不熟悉 Camel XML,因为我发现 Camel DSL 更易于阅读和使用。但是,在您提供的骆驼文档中,${bean:myguidgenerator.generateid}您没有在路线中使用“$”符号:fileName={bean:videoProcessor.getHash}

您还需要从文件扩展名中添加一个“$”登录。${文件:名称.ext}

我还复制了您的项目,在进行了这些“$”更改后,应用程序在我身边启动。但是,我相信您的实施存在更多问题,即使您开始实施它也不会达到您的预期。

这是我认为您的问题:

  1. getHash在将设置中使用该 beanfileName充当您要使用的文件名的过滤器。从你所说的来看,这不是你想要的。
  2. 如果我的理解是正确的,您想从 spool_in 文件夹中提取一个视频文件,使用视频处理器处理它,一旦处理完毕,将其移动到 .done 文件夹中并同时更改名称。为此,您需要在移动选项下移动文件表达式,如下所示:

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 

以及移动的文件:

在此处输入图像描述

于 2020-01-02T04:35:23.190 回答