Apache Camel - 需要递归读取文件
Apache Camel - Need to read file recursively
我有一个休息网络服务。对此网络服务的任何请求首先使用骆驼路线存储在一个文件夹(称为收件箱)中。另一个骆驼路线侦听此文件夹,如果服务器内存消耗低于阈值,则将请求放在 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 会将请求放入“.camel”文件夹中。相反,请求应保留在输入文件夹中,以便一次又一次地选择它,直到它真正放入队列中进行处理。
<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>
也许可以使用文件过滤器检查内存消耗,return true | false 是否要接受该文件。然后你不需要在路线中添加那个选择。
参见
中的 filter
选项
在你的处理器中抛出一个异常就可以了。它所做的是将消息标记为失败并且不会将其移动到 .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 会将请求放入“.camel”文件夹中。相反,请求应保留在输入文件夹中,以便一次又一次地选择它,直到它真正放入队列中进行处理。
<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>
也许可以使用文件过滤器检查内存消耗,return true | false 是否要接受该文件。然后你不需要在路线中添加那个选择。
参见
中的filter
选项
在你的处理器中抛出一个异常就可以了。它所做的是将消息标记为失败并且不会将其移动到 .camel 文件夹。因此文件消费者将其拾取并再次处理。