Camel-FTP只运行一次?

时间:2013-08-13 14:31:23

标签: apache-camel

当找不到文件时,我似乎无法让camel-ftp组件死掉。

我添加了LimitedPollingConsumerPollStrategy,其限制为1

<bean id="noPoll" class="org.apache.camel.impl.LimitedPollingConsumerPollStrategy">
    <property name="limit" value="1"/>
</bean>

并配置URI以使用它:

  

ftp://user@host.ftp/?password=pass&stepwise=false&binary=true&delete=false&noop=true&pollStrategy=#noPoll

它仍然只是挂起,寻找文件,当它找不到任何文件时......所以我在URI中添加了&sendEmptyMessageWhenIdle=true

我添加条件到我的路由输出到日志时消息通过一个空体并且我看到大量的这些消息所以它似乎对轮询消费者的限制不起作用。我尝试将其更改为&consumer.pollStrategy=#noPoll并且行为相同。

2 个答案:

答案 0 :(得分:2)

如果没有消息消耗,以下PollStrategy将停止消费者。

public class PollOncePollStrategy extends DefaultPollingConsumerPollStrategy {

    @Override
    public void commit(Consumer consumer, Endpoint endpoint, int polledMessages) {
        try {
            if (polledMessages == 0) {
                log.info("No polled messages, stopping consumer");
                endpoint.getCamelContext().createProducerTemplate().sendBody(String.format("controlbus:route?async=true&action=stop&routeId=%s", EndpointHelper.getRouteIdFromEndpoint(endpoint)), null);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

在camel注册表中注册并使用如下:ftp://127.0.0.1/mydir?pollStrategy=#pollOnce

答案 1 :(得分:1)

LimitedPollingConsumerPollStrategy用于限制消费者连续X次失败的时间。这也是它的文档中解释的内容。它不是在一次民意调查后停止的。

您可以实现自己的轮询策略,该策略在使用参数polledMessages = 0调用commit方法时停止。然后您知道没有轮询的文件。