Java spring sftp入站适配器的问题
我需要从SFTP位置收集文件,并定期将其放入本地输入目录。传输文件后,将从SFTP位置删除该文件。对于触发器,我使用一个定制的Cron触发器,在该触发器中我动态地更改间隔。下面是context.xml中的条目和CustomCronTrigger类的代码Java spring sftp入站适配器的问题,java,spring,sftp,spring-integration,Java,Spring,Sftp,Spring Integration,我需要从SFTP位置收集文件,并定期将其放入本地输入目录。传输文件后,将从SFTP位置删除该文件。对于触发器,我使用一个定制的Cron触发器,在该触发器中我动态地更改间隔。下面是context.xml中的条目和CustomCronTrigger类的代码 <bean id="sftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory"> <
<bean id="sftpSessionFactory" class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
<property name="host" value="127.0.0.1"/>
<property name="port" value="22"/>
<property name="user" value="user"/>
<property name="password" value="passwd"/>
</bean>
<int-sftp:inbound-channel-adapter id="sftpInboundAdapter"
channel="receiveChannel"
session-factory="sftpSessionFactory"
local-directory="/home/sftpUser"
remote-directory="/home/input"
delete-remote-files="true"
auto-create-local-directory="true"
filename-pattern="*.csv"
>
<int:poller trigger="customCronTrigger"/>
</int-sftp:inbound-channel-adapter>
<int:channel id="receiveChannel">
<int:queue/>
</int:channel>
public class CustomCronTrigger implements Trigger{
private CronSequenceGenerator sequenceGenerator;
private String intervalInMin;
public void setIntervalInMin(String intervalInMin) throws Exception
{
this.intervalInMin = intervalInMin;
createCronExpression();
}
/** The logger instance */
private Logger logger = LoggerFactory.getLogger(getClass());
public CronSequenceGenerator getSequenceGenerator() {
return sequenceGenerator;
}
public void createCronExpression() throws Exception {
String cronExpression = getCronExpression(intervalInMin);
logger.debug("CustomCronTrigger.setSequenceGeneratorStr()::cronExpression="+cronExpression);
this.sequenceGenerator = new CronSequenceGenerator(cronExpression, TimeZone.getDefault());
}
public Date nextExecutionTime(TriggerContext triggerContext) {
Date date = triggerContext.lastCompletionTime();
if (date != null) {
Date scheduled = triggerContext.lastScheduledExecutionTime();
if (scheduled != null && date.before(scheduled)) {
// Previous task apparently executed too early...
// Let's simply use the last calculated execution time then,
// in order to prevent accidental re-fires in the same second.
date = scheduled;
}
}
else {
date = new Date();
}
return this.sequenceGenerator.next(date);
}
public String getCronExpression(String min) throws Exception
{
if(Integer.parseInt(min)<0 || Integer.parseInt(min)>59 )
{
throw new Exception(String.format("Minute %s not valid. Please enter minute between 0-59",min));
}
String cronExpression = "0 0/"+min+" * * * ?";
return cronExpression;
}
@Override
public boolean equals(Object obj) {
return (this == obj || (obj instanceof CustomCronTrigger &&
this.sequenceGenerator.equals(((CustomCronTrigger) obj).sequenceGenerator)));
}
@Override
public int hashCode() {
return this.sequenceGenerator.hashCode();
}
@Override
public String toString() {
return this.sequenceGenerator.toString();
}
}
请建议替代方案,因为我对这个问题束手无策。不清楚您所说的“在连续的时间间隔内,文件不会被传输,只有在一些时间间隔后才会被传输”是什么意思
public class CustomCronTrigger implements Trigger{
private CronSequenceGenerator sequenceGenerator;
private String intervalInMin;
public void setIntervalInMin(String intervalInMin) throws Exception
{
this.intervalInMin = intervalInMin;
createCronExpression();
}
/** The logger instance */
private Logger logger = LoggerFactory.getLogger(getClass());
public CronSequenceGenerator getSequenceGenerator() {
return sequenceGenerator;
}
public void createCronExpression() throws Exception {
String cronExpression = getCronExpression(intervalInMin);
logger.debug("CustomCronTrigger.setSequenceGeneratorStr()::cronExpression="+cronExpression);
this.sequenceGenerator = new CronSequenceGenerator(cronExpression, TimeZone.getDefault());
}
public Date nextExecutionTime(TriggerContext triggerContext) {
Date date = triggerContext.lastCompletionTime();
if (date != null) {
Date scheduled = triggerContext.lastScheduledExecutionTime();
if (scheduled != null && date.before(scheduled)) {
// Previous task apparently executed too early...
// Let's simply use the last calculated execution time then,
// in order to prevent accidental re-fires in the same second.
date = scheduled;
}
}
else {
date = new Date();
}
return this.sequenceGenerator.next(date);
}
public String getCronExpression(String min) throws Exception
{
if(Integer.parseInt(min)<0 || Integer.parseInt(min)>59 )
{
throw new Exception(String.format("Minute %s not valid. Please enter minute between 0-59",min));
}
String cronExpression = "0 0/"+min+" * * * ?";
return cronExpression;
}
@Override
public boolean equals(Object obj) {
return (this == obj || (obj instanceof CustomCronTrigger &&
this.sequenceGenerator.equals(((CustomCronTrigger) obj).sequenceGenerator)));
}
@Override
public int hashCode() {
return this.sequenceGenerator.hashCode();
}
@Override
public String toString() {
return this.sequenceGenerator.toString();
}
}
请注意,如果您希望传输具有相同名称的文件,它将无法工作,因为默认的本地筛选器将不允许为其生成消息。即将发布的3.0版本有一个新的
本地过滤器
属性来更改该行为,或者您可以使用网关,正如我在中所建议的那样。“在连续的时间间隔上,文件不会被传输,并且仅在一些时间间隔后才被传输”。我的意思是,如果在第一个时间间隔内传输了5个文件,并且时间间隔为1分钟,那么下一组文件仅在4分钟后传输。这是一个意外的输出,因为它应在1分钟后传输下一组。
public class CustomCronTrigger implements Trigger{
private CronSequenceGenerator sequenceGenerator;
private String intervalInMin;
public void setIntervalInMin(String intervalInMin) throws Exception
{
this.intervalInMin = intervalInMin;
createCronExpression();
}
/** The logger instance */
private Logger logger = LoggerFactory.getLogger(getClass());
public CronSequenceGenerator getSequenceGenerator() {
return sequenceGenerator;
}
public void createCronExpression() throws Exception {
String cronExpression = getCronExpression(intervalInMin);
logger.debug("CustomCronTrigger.setSequenceGeneratorStr()::cronExpression="+cronExpression);
this.sequenceGenerator = new CronSequenceGenerator(cronExpression, TimeZone.getDefault());
}
public Date nextExecutionTime(TriggerContext triggerContext) {
Date date = triggerContext.lastCompletionTime();
if (date != null) {
Date scheduled = triggerContext.lastScheduledExecutionTime();
if (scheduled != null && date.before(scheduled)) {
// Previous task apparently executed too early...
// Let's simply use the last calculated execution time then,
// in order to prevent accidental re-fires in the same second.
date = scheduled;
}
}
else {
date = new Date();
}
return this.sequenceGenerator.next(date);
}
public String getCronExpression(String min) throws Exception
{
if(Integer.parseInt(min)<0 || Integer.parseInt(min)>59 )
{
throw new Exception(String.format("Minute %s not valid. Please enter minute between 0-59",min));
}
String cronExpression = "0 0/"+min+" * * * ?";
return cronExpression;
}
@Override
public boolean equals(Object obj) {
return (this == obj || (obj instanceof CustomCronTrigger &&
this.sequenceGenerator.equals(((CustomCronTrigger) obj).sequenceGenerator)));
}
@Override
public int hashCode() {
return this.sequenceGenerator.hashCode();
}
@Override
public String toString() {
return this.sequenceGenerator.toString();
}
}