Spring integration spring集成-SFTP确保上传成功

Spring integration spring集成-SFTP确保上传成功,spring-integration,sftp,spring-integration-sftp,Spring Integration,Sftp,Spring Integration Sftp,如何确保文件是否成功上传到SFTP服务器。我想确保SFTP上传成功,然后我只想应用其他逻辑。这是我要上传的代码 @Bean public DefaultSftpSessionFactory sftpSessionFactory() throws IOException { DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(); factory.setHost(config.getSftpHost

如何确保文件是否成功上传到SFTP服务器。我想确保SFTP上传成功,然后我只想应用其他逻辑。这是我要上传的代码

 @Bean
 public DefaultSftpSessionFactory sftpSessionFactory() throws IOException {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
    factory.setHost(config.getSftpHost());
    factory.setPort(Integer.parseInt(config.getSftpPort()));
    factory.setUser(config.getSftpUser());
    factory.setAllowUnknownKeys(true);
    factory.setTimeout(10000);
    factory.setPrivateKey(new ClassPathResource(config.getPrivateKey()));
   } 
@Bean
   @ServiceActivator(inputChannel = "toSftpChannel")
   public SftpMessageHandler uploadHandler() throws IOException {
    SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
    handler.setRemoteDirectoryExpression(new LiteralExpression(config.getSftpRemoteDirectory()));
    handler.setFileNameGenerator(new FileNameGenerator() {
    @Override
    public String generateFileName(Message<?> message) {
       if (message.getPayload() instanceof File) {
           return ((File) message.getPayload()).getName();
        } else {
            throw new IllegalArgumentException("File expected as payload.");
        }
      }
    });
   return handler;
  }
 @MessagingGateway
   public interface UploadGateway {
   @Gateway(requestChannel = "toSftpChannel")
    void upload(File file);
   }


不清楚你的意思是什么;如果上载失败,将引发异常

您可以向
SftpMessageHandler
添加重试建议以重试


基于Gary关于向重试添加重试建议的建议。我越来越不正常了

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'toSftpChannel' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:805)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1278)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:297)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
    at org.springframework.integration.support.channel.BeanFactoryChannelResolver.resolveDestination(BeanFactoryChannelResolver.java:89)
    at org.springframework.integration.support.channel.BeanFactoryChannelResolver.resolveDestination(BeanFactoryChannelResolver.java:46)
    at org.springframework.integration.gateway.MessagingGatewaySupport.getRequestChannel(MessagingGatewaySupport.java:387)
    at org.springframework.integration.gateway.MessagingGatewaySupport.send(MessagingGatewaySupport.java:422)
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.sendOrSendAndReceive(GatewayProxyFactoryBean.java:568)
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.invokeGatewayMethod(GatewayProxyFactoryBean.java:489)
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.doInvoke(GatewayProxyFactoryBean.java:464)
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.invoke(GatewayProxyFactoryBean.java:453)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
    at com.sun.proxy.$Proxy79.upload(Unknown Source)
我的sftp配置如下所示

    @Bean
    public DefaultSftpSessionFactory sftpSessionFactory() throws IOException {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
        //session config here, port, host, private key
      
  }
@Bean
    @ServiceActivator(inputChannel = "toSftpChannel", adviceChain="retryAdvice")
    public SftpMessageHandler uploadHandler() throws IOException {
        final SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
        handler.setRemoteDirectoryExpression(new LiteralExpression(config.getSftpRemoteDirectory()));
        //handler.setChmod(0600);   

        handler.setFileNameGenerator(new FileNameGenerator() {
            @Override
            public String generateFileName(Message<?> message) {
                if (message.getPayload() instanceof File) {
                    logger.info("Files request payload : " + message.getPayload().toString());
                    return ((File) message.getPayload()).getName();
                } else {
                    throw new IllegalArgumentException("File expected as payload.");
                }
            }
        });

        return handler;
    }

    @MessagingGateway
    public interface UploadGateway {
        @Gateway(requestChannel = "toSftpChannel")
        void upload(File file);
    }

    @Bean
    public SimpleRetryPolicy retryPolicy(){
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(5);
        return retryPolicy;
    }

    @Bean
    public FixedBackOffPolicy fixedBackOffPolicy(){
        FixedBackOffPolicy p = new FixedBackOffPolicy();
        p.setBackOffPeriod(1000);
        return p;
    }

    @Bean
    public RequestHandlerRetryAdvice retryAdvice(SimpleRetryPolicy retryPolicy, 
     FixedBackOffPolicy fixedBackOffPolicy){
        RequestHandlerRetryAdvice retryAdvice = new RequestHandlerRetryAdvice();
        RetryTemplate retryTemplate = new RetryTemplate();
        retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
        retryAdvice.setRetryTemplate(retryTemplate);
        return retryAdvice;
    }
@Bean
公共默认sftpSessionFactory sftpSessionFactory()引发IOException{
DefaultSftpSessionFactory=新的DefaultSftpSessionFactory();
//此处的会话配置、端口、主机、私钥
}
@豆子
@ServiceActivator(inputChannel=“toSftpChannel”,adviceChain=“retryAdvice”)
公共SftpMessageHandler uploadHandler()引发IOException{
final SftpMessageHandler=新的SftpMessageHandler(sftpSessionFactory());
setRemoteDirectoryExpression(新的LiteralExpression(config.getSftpRemoteDirectory());
//handler.setChmod(0600);
handler.setFileNameGenerator(新FileNameGenerator(){
@凌驾
公共字符串generateFileName(消息){
if(message.getPayload()instanceof文件){
logger.info(“文件请求负载:+message.getPayload().toString());
返回((文件)message.getPayload()).getName();
}否则{
抛出新的IllegalArgumentException(“预期为有效负载的文件”);
}
}
});
返回处理程序;
}
@消息网关
公共接口上传网关{
@网关(requestChannel=“toSftpChannel”)
无效上传(文件);
}
@豆子
公共简单政策retryPolicy(){
SimpleRetryPolicy retryPolicy=新的SimpleRetryPolicy();
retryPolicy.setMaxAttempts(5);
退货政策;
}
@豆子
public FixedBackOffPolicy FixedBackOffPolicy(){
FixedBackOffPolicy p=新的FixedBackOffPolicy();
p、 退避期(1000);
返回p;
}
@豆子
公共请求HandlerRetryAdvice retryAdvice(简单策略retryPolicy,
固定回退政策(固定回退政策){
RequestHandlerRetryAdvice retryAdvice=新建RequestHandlerRetryAdvice();
RetryTemplate RetryTemplate=新RetryTemplate();
retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
setRetryTemplate(retryTemplate);
回复回复建议;
}

我的意思是,一旦文件上传到远程服务器,我们如何确保它成功地传输到远程(SFTP)服务器如果没有引发异常,那么它就是成功的。就这么简单。
    @Bean
    public DefaultSftpSessionFactory sftpSessionFactory() throws IOException {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
        //session config here, port, host, private key
      
  }
@Bean
    @ServiceActivator(inputChannel = "toSftpChannel", adviceChain="retryAdvice")
    public SftpMessageHandler uploadHandler() throws IOException {
        final SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
        handler.setRemoteDirectoryExpression(new LiteralExpression(config.getSftpRemoteDirectory()));
        //handler.setChmod(0600);   

        handler.setFileNameGenerator(new FileNameGenerator() {
            @Override
            public String generateFileName(Message<?> message) {
                if (message.getPayload() instanceof File) {
                    logger.info("Files request payload : " + message.getPayload().toString());
                    return ((File) message.getPayload()).getName();
                } else {
                    throw new IllegalArgumentException("File expected as payload.");
                }
            }
        });

        return handler;
    }

    @MessagingGateway
    public interface UploadGateway {
        @Gateway(requestChannel = "toSftpChannel")
        void upload(File file);
    }

    @Bean
    public SimpleRetryPolicy retryPolicy(){
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(5);
        return retryPolicy;
    }

    @Bean
    public FixedBackOffPolicy fixedBackOffPolicy(){
        FixedBackOffPolicy p = new FixedBackOffPolicy();
        p.setBackOffPeriod(1000);
        return p;
    }

    @Bean
    public RequestHandlerRetryAdvice retryAdvice(SimpleRetryPolicy retryPolicy, 
     FixedBackOffPolicy fixedBackOffPolicy){
        RequestHandlerRetryAdvice retryAdvice = new RequestHandlerRetryAdvice();
        RetryTemplate retryTemplate = new RetryTemplate();
        retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
        retryAdvice.setRetryTemplate(retryTemplate);
        return retryAdvice;
    }