我正在尝试在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设置调用。
答案 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中替换。