2

我正在使用 Camel (2.11.0) 来尝试实现以下功能:

  • 如果文件存在于某个位置,请将其复制到另一个位置,然后开始处理它
  • 如果不存在这样的文件,那么我不希望文件使用者/轮询器阻塞;我只想处理继续direct:cleanup路由

我只希望文件被轮询一次!

这是我到目前为止所拥有的(使用 Spring XML):

<camelContext id="my-camel-context" xmlns="http://camel.apache.org/schema/spring">
    <route id="my-route
        <from uri="file:///home/myUser/myApp/fizz?include=buzz_.*txt"/>

        <choice>
            <when>
                <!-- If the body is empty/NULL, then there was no file. Send to cleanup route. -->
                <simple>${body} == null</simple>
                <to uri="direct:cleanup" />
            </when>

            <otherwise>
                <!-- Otherwise we have a file. Copy it to the parent directory, and then continue processing. -->
                <to uri="file:///home/myUser/myApp" />
            </otherwise>
        </choice>

        <!-- We should only get here if a file existed and we've already copied it to the parent directory. -->
        <to uri="bean:shouldOnlyGetHereIfFileExists?method=doSomething" />
    </route>

    <!--
        Other routes defined down here, including one with a "direct:cleanup" endpoint.
    -->
</camelContext>

使用上述配置,如果 没有文件/home/myUser/myApp/fizz,那么 Camel 只会等待/阻塞,直到有文件。相反,我希望它放弃并继续前进direct:cleanup

如果有一个文件,我会看到它在shouldOnlyGetHereIfFileExistsbean 中得到处理,但我没有看到它被复制到/home/myUser/myApp; 所以几乎就好像<otherwise>元素被完全跳过/忽略了!

有任何想法吗?提前致谢!

4

4 回答 4

2

试试这个设置,并调整你的轮询间隔以适应:

来自骆驼文件组件文档:

空闲时发送空消息

默认=假

Camel 2.9:如果轮询消费者没有轮询任何文件,您可以启用此选项以发送空消息(无正文)。

关于写入文件,请在其中添加一条日志语句<otherwise>以确保它正在执行。如果是这样,请检查文件/文件夹权限等。

祝你好运。

于 2014-01-21T12:54:05.453 回答
0

我在尝试使用该条件时遇到的一个错误:

 <simple>${body} != null</simple>

它总是返回true吗?

请通过以下链接:

http://camel.465427.n5.nabble.com/choice-when-check-BodyType-null-Body-null-td4259599.html

它可能会帮助你。

于 2014-01-22T07:35:23.850 回答
0

这很老了,但如果有人发现这个,你只能用 "?repeatCount=1" 轮询一次

于 2017-10-30T12:33:42.927 回答
0

我知道这个问题几乎是在 4 年前完成的,但我昨天遇到了同样的问题。所以我会把我的答案放在这里,也许它会帮助另一个人。我正在使用 Camel,版本 3.10.0

为了使其完全按照问题中的描述工作:

  • 如果文件存在于某个位置,请将其复制到另一个位置,然后开始处理它
  • 如果不存在这样的文件,那么我不希望文件使用者/轮询器阻塞;我只想处理继续直接:清理路线
  • 只希望文件被轮询一次!

使用 ${body} == null 我们需要的配置是:

sendEmptyMessageWhenIdle=true //空闲时会发送一个空正文

maxMessagesPerPoll=1 //一次最大文件数

repeatCount=1 //会执行多少次Pool(上图)

greedy=true // 如果最后一个池执行了文件,它会再执行一次

XML:

<camel:endpoint id="" uri="file:DIRECTORY?sendEmptyMessageWhenIdle=true&amp;initialDelay=100&amp;maxMessagesPerPoll=1&amp;repeatCount=1&amp;greedy=false" />
于 2021-07-21T14:35:16.867 回答