最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot2.1.3配置sftp自定義sftp連接池的詳細過程

 更新時間:2021年08月24日 15:12:19   作者:lshan  
這篇文章主要介紹了springboot2.1.3配置sftp自定義sftp連接池的詳細過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

項目地址

項目地址:https://gitee.com/xuelingkang/spring-boot-demo
完整配置參考com.example.ftp包

maven:

<!-- sftp -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>
<!-- commons-pool2 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.6.1</version>
</dependency>

application.yml配置

sftp:
  host: server02 # 服務器ip
  port: 22 # ssh端口
  username: demofile # 用戶名
  password: demo # 密碼
  # 連接池參數(shù)
  pool:
    max-total: 10
    max-idle: 10
    min-idle: 5

SftpProperties

package com.example.ftp;

import com.jcraft.jsch.ChannelSftp;
import lombok.Data;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties(prefix = "sftp")
public class SftpProperties {

    private String host;
    private int port = 22;
    private String username = "root";
    private String password = "root";
    private Pool pool = new Pool();

    public static class Pool extends GenericObjectPoolConfig<ChannelSftp> {

        private int maxTotal = DEFAULT_MAX_TOTAL;
        private int maxIdle = DEFAULT_MAX_IDLE;
        private int minIdle = DEFAULT_MIN_IDLE;

        public Pool() {
            super();
        }
        @Override
        public int getMaxTotal() {
            return maxTotal;
        }
        @Override
        public void setMaxTotal(int maxTotal) {
            this.maxTotal = maxTotal;
        }
        @Override
        public int getMaxIdle() {
            return maxIdle;
        }
        @Override
        public void setMaxIdle(int maxIdle) {
            this.maxIdle = maxIdle;
        }
        @Override
        public int getMinIdle() {
            return minIdle;
        }
        @Override
        public void setMinIdle(int minIdle) {
            this.minIdle = minIdle;
        }

    }

}

sftp連接工廠

package com.example.ftp;
import com.example.exception.ProjectException;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;

import java.util.Properties;

@Data
@Slf4j
public class SftpFactory extends BasePooledObjectFactory<ChannelSftp> {

    private SftpProperties properties;

    public SftpFactory(SftpProperties properties) {
        this.properties = properties;
    }

    @Override
    public ChannelSftp create() {
        try {
            JSch jsch = new JSch();
            Session sshSession = jsch.getSession(properties.getUsername(), properties.getHost(), properties.getPort());
            sshSession.setPassword(properties.getPassword());
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            ChannelSftp channel = (ChannelSftp) sshSession.openChannel("sftp");
            channel.connect();
            return channel;
        } catch (JSchException e) {
            throw new ProjectException("連接sfpt失敗", e);
        }
    }

    @Override
    public PooledObject<ChannelSftp> wrap(ChannelSftp channelSftp) {
        return new DefaultPooledObject<>(channelSftp);
    }

    // 銷毀對象
    @Override
    public void destroyObject(PooledObject<ChannelSftp> p) {
        ChannelSftp channelSftp = p.getObject();
        channelSftp.disconnect();
    }

}

sftp連接池

package com.example.ftp;

import com.example.exception.ProjectException;
import com.jcraft.jsch.ChannelSftp;
import lombok.Data;
import org.apache.commons.pool2.impl.GenericObjectPool;

@Data
public class SftpPool {

    private GenericObjectPool<ChannelSftp> pool;

    public SftpPool(SftpFactory factory) {
        this.pool = new GenericObjectPool<>(factory, factory.getProperties().getPool());
    }

    /**
     * 獲取一個sftp連接對象
     * @return sftp連接對象
     */
    public ChannelSftp borrowObject() {
        try {
            return pool.borrowObject();
        } catch (Exception e) {
            throw new ProjectException("獲取ftp連接失敗", e);
        }
    }

    /**
     * 歸還一個sftp連接對象
     * @param channelSftp sftp連接對象
     */
    public void returnObject(ChannelSftp channelSftp) {
        if (channelSftp!=null) {
            pool.returnObject(channelSftp);
        }
    }

}

sftp輔助類

package com.example.ftp;

import com.example.exception.ProjectException;
import com.example.util.ByteUtil;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.SftpException;

import java.io.InputStream;

// sftp輔助類
public class SftpHelper {

    private SftpPool pool;

    public SftpHelper(SftpPool pool) {
        this.pool = pool;
    }

    /**
     * 下載文件
     * @param dir 遠程目錄
     * @param name 遠程文件名
     * @return 文件字節(jié)數(shù)組
     */
    public byte[] download(String dir, String name) {
        ChannelSftp sftp = pool.borrowObject();
        try {
            sftp.cd(dir);
            InputStream in = sftp.get(name);
            return ByteUtil.inputStreamToByteArray(in);
        } catch (SftpException e) {
            throw new ProjectException("sftp下載文件出錯", e);
        } finally {
            pool.returnObject(sftp);
        }
    }

    /**
     * 上傳文件
     * @param dir 遠程目錄
     * @param name 遠程文件名
     * @param in 輸入流
     */
    public void upload(String dir, String name, InputStream in) {
        ChannelSftp sftp = pool.borrowObject();
        try {
            mkdirs(sftp, dir);
            sftp.cd(dir);
            sftp.put(in, name);
        } catch (SftpException e) {
            throw new ProjectException("sftp上傳文件出錯", e);
        } finally {
            pool.returnObject(sftp);
        }
    }

    /**
     * 刪除文件
     * @param dir 遠程目錄
     * @param name 遠程文件名
     */
    public void delete(String dir, String name) {
        ChannelSftp sftp = pool.borrowObject();
        try {
            sftp.cd(dir);
            sftp.rm(name);
        } catch (SftpException e) {
            throw new ProjectException("sftp刪除文件出錯", e);
        } finally {
            pool.returnObject(sftp);
        }
    }

    /**
     * 遞歸創(chuàng)建多級目錄
     * @param dir 多級目錄
     */
    private void mkdirs(ChannelSftp sftp, String dir) {
        String[] folders = dir.split("/");
        try {
            sftp.cd("/");
            for (String folder: folders) {
                if (folder.length()>0) {
                    try {
                        sftp.cd(folder);
                    } catch (Exception e) {
                        sftp.mkdir(folder);
                        sftp.cd(folder);
                    }
                }
            }
        } catch (SftpException e) {
            throw new ProjectException("sftp創(chuàng)建目錄出錯", e);
        }
    }

}

主配置類

package com.example.config;

import com.example.ftp.SftpFactory;
import com.example.ftp.SftpHelper;
import com.example.ftp.SftpPool;
import com.example.ftp.SftpProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// ftp配置
@Configuration
@EnableConfigurationProperties(SftpProperties.class)
public class SftpConfig {

    // 工廠
    @Bean
    public SftpFactory sftpFactory(SftpProperties properties) {
        return new SftpFactory(properties);
    }

    // 連接池
    @Bean
    public SftpPool sftpPool(SftpFactory sftpFactory) {
        return new SftpPool(sftpFactory);
    }

    // 輔助類
    @Bean
    public SftpHelper sftpHelper(SftpPool sftpPool) {
        return new SftpHelper(sftpPool);
    }

}

使用方法

@Autowired
private SftpHelper sftpHelper;

注入輔助類,直接調用方法即可。

到此這篇關于springboot2.1.3配置sftp自定義sftp連接池的文章就介紹到這了,更多相關springboot自定義sftp連接池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • spring mvc中@PathVariable / 帶斜杠方式獲取

    spring mvc中@PathVariable / 帶斜杠方式獲取

    這篇文章主要介紹了spring mvc中@PathVariable / 帶斜杠方式獲取,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解Java?POI?excel自定義設置單元格格式

    詳解Java?POI?excel自定義設置單元格格式

    這篇文章主要介紹了Java?POI?excel設置單元格格式,自定義設置,設置單元格格式:來源_formats,更多數(shù)據(jù)類型從formats里面發(fā)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • java中判斷String類型為空和null的幾種方法

    java中判斷String類型為空和null的幾種方法

    判斷一個字符串是否為空或者為null是一個常見的操作,本文主要介紹了java中判斷String類型為空和null的幾種方法,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Java循環(huán)創(chuàng)建對象內存溢出的解決方法

    Java循環(huán)創(chuàng)建對象內存溢出的解決方法

    在Java中,如果在循環(huán)中不當?shù)貏?chuàng)建大量對象而不及時釋放內存,很容易導致內存溢出(OutOfMemoryError),所以本文給大家介紹了Java循環(huán)創(chuàng)建對象內存溢出的解決方法,需要的朋友可以參考下
    2025-01-01
  • SpringBoot自動裝配原理詳解

    SpringBoot自動裝配原理詳解

    這篇文章主要介紹了SpringBoot自動裝配原理的相關資料,幫助大家更好的理解和學習使用SpringBoot框架,感興趣的朋友可以了解下
    2021-03-03
  • 詳解Java中的四種引用類型(強軟弱虛)

    詳解Java中的四種引用類型(強軟弱虛)

    Java中的引用類型主要分為四種,分別是強引用、軟引用、弱引用和虛引用,這篇文章主要為大家詳細介紹了四者的使用與區(qū)別,需要的小伙伴可以參考下
    2023-10-10
  • Spring Boot 分庫分表策略示例展示

    Spring Boot 分庫分表策略示例展示

    分庫分表是為了應對大規(guī)模數(shù)據(jù)和高并發(fā)請求,提高系統(tǒng)的性能和可擴展性,以下是如何在 Spring Boot 中實現(xiàn)分庫分表的詳細策略,感興趣的朋友一起看看吧
    2024-08-08
  • java設計模式責任鏈模式原理案例詳解

    java設計模式責任鏈模式原理案例詳解

    一個事件需要經(jīng)過多個對象處理是一個挺常見的場景,譬如采購審批流程,請假流程,軟件開發(fā)中的異常處理流程,web請求處理流程等各種各樣的流程,可以考慮使用責任鏈模式來實現(xiàn)
    2021-09-09
  • SpringBoot整合activemq的案例代碼

    SpringBoot整合activemq的案例代碼

    ActiveMQ是消息隊列技術,為解決高并發(fā)問題而生,本文通過案例代碼給大家介紹pringBoot整合activemq的詳細過程,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • 在Java中實現(xiàn)讓線程按照自己指定的順序執(zhí)行

    在Java中實現(xiàn)讓線程按照自己指定的順序執(zhí)行

    這篇文章主要介紹了在Java中實現(xiàn)讓線程按照自己指定的順序執(zhí)行,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

定陶县| 长丰县| 揭东县| 临泽县| 永顺县| 临西县| 甘洛县| 荣成市| 平遥县| 神木县| 唐山市| 墨竹工卡县| 临城县| 衡山县| 新津县| 三亚市| 延安市| 新营市| 平定县| 贺兰县| 乌拉特后旗| 双鸭山市| 方城县| 盐城市| 缙云县| 日照市| 华阴市| 永吉县| 曲麻莱县| 肥乡县| 迭部县| 宾阳县| 漳州市| 定兴县| 茂名市| 闽侯县| 富阳市| 通江县| 屯留县| 海口市| 余姚市|