apache camel:使用sftp组件进行自定义sftp配置

时间:2017-09-04 10:21:36

标签: apache-camel

我正在尝试在Apache Camel中添加自定义sftp组件,以将用户名,主机,端口和密码包装在要传递给sftpcomponent的配置对象中。

以下是我尝试过的代码:

null

//在其他班级

@Configuration
class SftpConfig {
    @Bean("sourceSftp")
    public SftpComponent getSourceSftpComponent(
            @Qualifier("sftpConfig")
            SftpConfiguration sftpConfig) throws Exception{
        SftpComponent sftpComponent = new SftpComponent();
        // not getting way to set the configuration
        return sftpComponent;
    }


    @Bean("sftpConfig")
    public SftpConfiguration getSftpConfig(
            @Value("${host}") String host,
            @Value("${port}") int port,
            @Value("${applicationUserName}") String applicationUserName,
            @Value("${password}") String password) {
        SftpConfiguration sftpConfiguration =  new SftpConfiguration();
        sftpConfiguration.setHost(host);
        sftpConfiguration.setPort(port);
        sftpConfiguration.setUsername(applicationUserName);
        sftpConfiguration.setPassword(password);
        return sftpConfiguration;
    }

}

JMSComponent中的类似方法在我为sourcejms创建bean的情况下工作正常,但我无法为sftp执行此操作,因为SftpComponent没有为sftpconfiguration设置调用。

2 个答案:

答案 0 :(得分:0)

Camel维护者似乎正在不再使用“setXXXConfiguration”方法为单个组件配置其属性。提供属性的“已批准”方法(与SFTP一起使用)是在连接URL上指定它们:

from ("sftp://host:port/foo?username=foo&password=bar")
.to (....)

另一种方法是实例化端点并设置其属性,然后在from()调用中使用对端点的引用。有很多种方法可以配置Camel - 这对我来说可用于基于XML的配置:

<endpoint id="fred" uri="sftp://acme.net/test/">
  <property key="username" value="xxxxxxx"/>
  <property key="password" value="yyyyyyy"/>
</endpoint>
<route>
  <from uri="fred"/>
  <to uri="log:foo"/>
</route>

答案 1 :(得分:0)

您可以通过扩展SftpComponent对其进行自定义。这使您可以定义多个端点,而无需为每个端点定义提供用户名/密码。

步骤1:扩展SftpComponent并给您的组件起一个自定义名称,即customSftp

@Component("customSftp")
public class CustomSftpComponent extends SftpComponent {

    private static final Logger LOG = LoggerFactory.getLogger(CustomSftpComponent.class);

    @Value("${sftp.username}")
    private String username;

    @Value("${sftp.password}")
    private String password;

    @SuppressWarnings("rawtypes")
    protected void afterPropertiesSet(GenericFileEndpoint<SftpRemoteFile> endpoint) throws Exception {
        SftpConfiguration config = (SftpConfiguration) endpoint.getConfiguration();
        config.setUsername(username);
        config.setPassword(password);
    }

}

第2步:使用您自定义的组件名称创建骆驼路线以轮询2个不同的文件夹。

@Component
public class PollSftpRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        from("{{sftp.endpoint1}}").routeId("pollSftpRoute1")
            .log(LoggingLevel.INFO, "Downloaded file from input folder 1.")
            .to("file:data/out1");

        from("{{sftp.endpoint2}}").routeId("pollSftpRoute2")
            .log(LoggingLevel.INFO, "Downloaded file from input folder 2.")
            .to("file:data/out2");

    }

}

第3步:将其放置在application.properties中

camel.springboot.main-run-controller=true

sftp.endpoint1=customSftp://localhost.net/input/1?delay=30s
sftp.endpoint2=customSftp://localhost.net/input/2?delay=30s

sftp.username=sftp_user1_l
sftp.password=xxxxxxxxxxxx

使用此方法,您不必为每个端点重复用户名/密码。

注意:使用这种方法,您将无法在URI端点配置中设置用户名/密码。您在URI中设置的所有内容都将在afterPropertiesSet中替换。