3

我有一个标准路由,将 ftp uri 作为消费者端点,并定义了 pollStrategy 并将其添加到注册表中。但是,我收到以下错误:

Caused by: java.lang.IllegalArgumentException: Could not find a suitable setter for property: pollStrategy as there isn't a setter method with same type: java.lang.String nor type conversion possible: No type converter available to convert from type: java.lang.String to the required type: org.apache.camel.spi.PollingConsumerPollStrategy with value #pollingStrategy
        at org.apache.camel.util.IntrospectionSupport.setProperty(IntrospectionSupport.java:588)
        at org.apache.camel.util.IntrospectionSupport.setProperty(IntrospectionSupport.java:616)
        at org.apache.camel.util.IntrospectionSupport.setProperties(IntrospectionSupport.java:473)
        at org.apache.camel.util.IntrospectionSupport.setProperties(IntrospectionSupport.java:483)
        at org.apache.camel.util.EndpointHelper.setProperties(EndpointHelper.java:255)
        at org.apache.camel.impl.DefaultComponent.setProperties(DefaultComponent.java:257)
        at org.apache.camel.component.file.GenericFileComponent.createEndpoint(GenericFileComponent.java:67)
        at org.apache.camel.component.file.GenericFileComponent.createEndpoint(GenericFileComponent.java:37)
        at org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:114)
        at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:568)

我尝试了不同的组合,但总是以这个错误告终。谁能发现我错过了什么?我的代码看起来与我看过的 Camel 单元测试非常相似。路线如下所示:

import org.apache.camel.*;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultPollingConsumerPollStrategy;
import org.apache.camel.spi.PollingConsumerPollStrategy;
import org.apache.camel.util.ServiceHelper;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import static org.apache.camel.builder.ProcessorBuilder.setBody;

public class Test extends RouteBuilder {

  final CamelContext camelContext = getContext();
  final org.apache.camel.impl.SimpleRegistry registry = new org.apache.camel.impl.SimpleRegistry();
  final org.apache.camel.impl.CompositeRegistry compositeRegistry = new org.apache.camel.impl.CompositeRegistry();
  private final CountDownLatch latch = new CountDownLatch(1);

  @Override
  public void configure() throws Exception {
    ExceptionBuilder.setup(this);
    compositeRegistry.addRegistry(camelContext.getRegistry());
    compositeRegistry.addRegistry(registry);
    ((org.apache.camel.impl.DefaultCamelContext) camelContext).setRegistry(compositeRegistry);
    registry.put("pollingStrategy", new MyPollStrategy());
    from("ftp://user@localhost/receive/in?password=1234&autoCreate=false&startingDirectoryMustExist=true&pollStrategy=#pollingStrategy&fileName=test.csv&consumer.delay=10m")
            .convertBodyTo(String.class)
            .log(LoggingLevel.INFO, "TEST", "${body} : ${headers}");

  }

  private class MyPollStrategy implements PollingConsumerPollStrategy {
    int maxPolls=3;
    public boolean begin(Consumer consumer, Endpoint endpoint) {
      return true;
    }

    public void commit(Consumer consumer, Endpoint endpoint, int polledMessages) {
      if (polledMessages > maxPolls) {
        maxPolls = polledMessages;
      }
      latch.countDown();
    }

    public boolean rollback(Consumer consumer, Endpoint endpoint, int retryCounter, Exception cause) throws Exception {
      return false;
    }
  }
} 

请注意,如果我删除 uri 中的 pollStrategy 引用,那么一切正常。

4

1 回答 1

1

好的,找到了解决方案……在处理这个问题时一定喝了太多啤酒……有点太明显了。

 final CamelContext camelContext = getContext();
  final org.apache.camel.impl.SimpleRegistry registry = new org.apache.camel.impl.SimpleRegistry();
  final org.apache.camel.impl.CompositeRegistry compositeRegistry = new org.apache.camel.impl.CompositeRegistry(); 

该部分应该在配置方法中,而不是在类变量声明部分中。

于 2016-06-18T15:50:06.680 回答