【问题标题】:spring integration - SFTP make sure upload is successfullyspring integration - SFTP 确保上传成功
【发布时间】:2020-10-14 16:03:29
【问题描述】:

我们如何确定文件是否成功上传到 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);
   }

我看到日志看起来不错。验证文件正在上传到 SFTP 服务器。但不知何故,我无法确保文件正在上传到服务器上。请告知如何添加代码以确保文件成功上传。

  jsch Connecting to info.xyz.com port 22
  jsch Connection established
  jsch Remote version string: SSH-.0-Internal_SFTP__100
  jsch Local version string: SSH-.0-JSCH-0.1.4
  jsch CheckCiphers: aes6-ctr,aes19-ctr,aes18-ctr,aes6-cbc,aes19-cbc,aes18-cbc,des-ctr,arcfour,arcfour18,arcfour6
  jsch CheckKexes: diffie-hellman-group14-sha1,ecdh-sha-nistp6,ecdh-sha-nistp84,ecdh-sha-nistp1
  jsch CheckSignatures: ecdsa-sha-nistp6,ecdsa-sha-nistp84,ecdsa-sha-nistp1
  jsch SSH_MSG_KEXINIT sent
  jsch SSH_MSG_KEXINIT received
  jsch kex: server: diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha6,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1
  jsch kex: server: ssh-rsa
  jsch kex: server: aes18-ctr,aes6-cbc,aes19-cbc,aes18-cbc,aes6-ctr,aes19-ctr,des-cbc,blowfish-cbc,arcfour,arcfour18,arcfour6
  jsch kex: server: aes18-ctr,aes6-cbc,aes19-cbc,aes18-cbc,aes6-ctr,aes19-ctr,des-cbc,blowfish-cbc,arcfour,arcfour18,arcfour6
  jsch kex: server: hmac-sha-6,hmac-sha1-96,hmac-sha1,hmac-sha-1,hmac-md,hmac-sha-1-96,hmac-sha-6-96,hmac-md-96,hmac-sha6,hmac-sha6@ssh.com
  jsch kex: server: hmac-sha6,hmac-sha-6,hmac-sha1-96,hmac-sha1,hmac-sha-1,hmac-md,hmac-sha-1-96,hmac-sha-6-96,hmac-md-96,hmac-sha6@ssh.com
  jsch kex: server: none
  jsch kex: server: none
  jsch kex: server: 
  jsch kex: server: 
  jsch kex: client: ecdh-sha-nistp6,ecdh-sha-nistp84,ecdh-sha-nistp1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha6,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
  jsch kex: client: ssh-rsa,ssh-dss,ecdsa-sha-nistp6,ecdsa-sha-nistp84,ecdsa-sha-nistp1
  jsch kex: client: aes18-ctr,aes18-cbc,des-ctr,des-cbc,blowfish-cbc,aes19- 
 ctr,aes19-cbc,aes6-ctr,aes6-cbc
  jsch kex: client: aes18-ctr,aes18-cbc,des-ctr,des-cbc,blowfish-cbc,aes19- 
   ctr,aes19-cbc,aes6-ctr,aes6-cbc
  jsch kex: client: hmac-md,hmac-sha1,hmac-sha-6,hmac-sha1-96,hmac-md-96
  jsch kex: client: hmac-md,hmac-sha1,hmac-sha-6,hmac-sha1-96,hmac-md-96
  jsch kex: client: none
  jsch kex: client: none
  jsch kex: client: 
  jsch kex: client: 
  jsch kex: server->client aes1-ctr hmac-md none
  jsch kex: client->server aes1-ctr hmac-md none
  jsch SSH_MSG_KEXDH_INIT sent
  jsch expecting SSH_MSG_KEXDH_REPLY
  jsch ssh_rsa_verify: signature true
  jsch Host 'info.xyz.com' is known and matches the RSA host key
  jsch SSH_MSG_NEWKEYS sent
  jsch SSH_MSG_NEWKEYS received
  jsch SSH_MSG_SERVICE_REQUEST sent
  jsch SSH_MSG_SERVICE_ACCEPT received
  jsch Authentications that can continue: publickeykeyboard-interactivepassword
  jsch Next authentication method: publickey
  jsch Authentication succeeded (publickey).
  jsch Disconnecting from info.xyz.com port 22

【问题讨论】:

    标签: spring-integration sftp spring-integration-sftp


    【解决方案1】:

    不清楚你的意思;如果上传失败,会抛出异常。

    您可以向SftpMessageHandler 添加重试建议以进行重试。

    https://docs.spring.io/spring-integration/docs/5.3.2.RELEASE/reference/html/messaging-endpoints.html#message-handler-advice-chain

    【讨论】:

    • 我的意思是一旦文件上传到远程服务器,我们如何确保它成功传输到远程(SFTP)服务器
    • 如果没有抛出异常,则表示成功。就这么简单。
    【解决方案2】:

    基于 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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2017-09-18
      相关资源
      最近更新 更多