Apache Camel - 需要递归读取文件

时间:2015-04-16 11:55:28

标签: recursion apache-camel

我有一个休息的网络服务。对此Web服务的任何请求首先使用camel路由存储在文件夹(称为收件箱)中。另一个camel路由侦听此文件夹,如果服务器内存消耗低于阈值,则将请求放在JMS队列上,否则它应该将请求放回到收件箱文件夹中。

因此,如果内存消耗高于阈值,则第二条路径应继续从收件箱文件夹中挑选文件并以递归方式将其放回原处。然而,这并没有发生。请提供一些关于如何使这项工作的指示。以下是我正在使用的路线:

    <route>
        <!--  Reading from MDW REST url -->
        <from uri="mdw:REST/REST" />
        <!--  Parsing OrderNumber and OrderVersion-->
        <setHeader headerName="OrderNumber">
            <xpath>Some path</xpath>
        </setHeader>
        <setHeader headerName="OrderVersion">
            <xpath>Some path</xpath>
        </setHeader>
        <!-- Request being put in file folder -->
        <to
            uri="file:data/inbox?fileName=${header.OrderNumber}-${header.OrderVersion}.xml"
            pattern="InOut" />
    </route>
    <!-- route with when clause: Checks memory consumption before putting message 
        on queue. If consumption below threshold put on queue
        else put back into input folderk-->
    <route>
        <from uri="file:data/inbox" />
        <camel:process ref="checkMemoryConsumption" />
        <camel:when>
        <!-- If  -->
            <camel:simple>${in.header.result} == 'true'</camel:simple>
            <camel:convertBodyTo type="String" />
            <to uri="jms queue"
                pattern="InOut" />
        </camel:when>
        <camel:when>
            <camel:simple>${in.header.result} == 'false'</camel:simple>
            <camel:convertBodyTo type="String" />
            <to uri="file:data/inbox"  pattern="InOut" />
        </camel:when>
    </route>

尝试使用过滤器,但也不起作用。如果内存消耗高于阈值,则camel将请求放入&#39; .camel&#39;夹。相反,请求应保留在输入文件夹中,以便一次又一次地将其选中,直到它实际放入队列进行处理。

<camel:route>
<camel:from uri="file:data/inbox"/>
<camel:filter>
    <method ref="checkMemory" method="isFreeMemoryAboveSafeLimit"/>
    <to uri="jms:queue:com.centurylink.mdw.external.event.queue"
            pattern="InOut" />
</camel:filter>

2 个答案:

答案 0 :(得分:1)

也许使用文件过滤器检查内存消耗并返回true | false是否要接受该文件。然后你不需要在路线中添加那个选择。

请参阅

上的filter选项

答案 1 :(得分:0)

在处理器中抛出异常就可以了。这样做是因为它将消息标记为失败并且不将其移动到.camel文件夹。因此,文件消费者会将其选中并再次处理。