springboot2.1.3配置sftp自定義sftp連接池的詳細(xì)過(guò)程
項(xiàng)目地址
項(xiàng)目地址: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 # 服務(wù)器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);
}
// 銷毀對(duì)象
@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());
}
/**
* 獲取一個(gè)sftp連接對(duì)象
* @return sftp連接對(duì)象
*/
public ChannelSftp borrowObject() {
try {
return pool.borrowObject();
} catch (Exception e) {
throw new ProjectException("獲取ftp連接失敗", e);
}
}
/**
* 歸還一個(gè)sftp連接對(duì)象
* @param channelSftp sftp連接對(duì)象
*/
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 遠(yuǎn)程目錄
* @param name 遠(yuǎn)程文件名
* @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下載文件出錯(cuò)", e);
} finally {
pool.returnObject(sftp);
}
}
/**
* 上傳文件
* @param dir 遠(yuǎn)程目錄
* @param name 遠(yuǎn)程文件名
* @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上傳文件出錯(cuò)", e);
} finally {
pool.returnObject(sftp);
}
}
/**
* 刪除文件
* @param dir 遠(yuǎn)程目錄
* @param name 遠(yuǎn)程文件名
*/
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刪除文件出錯(cuò)", e);
} finally {
pool.returnObject(sftp);
}
}
/**
* 遞歸創(chuàng)建多級(jí)目錄
* @param dir 多級(jí)目錄
*/
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)建目錄出錯(cuò)", 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;
注入輔助類,直接調(diào)用方法即可。
到此這篇關(guān)于springboot2.1.3配置sftp自定義sftp連接池的文章就介紹到這了,更多相關(guān)springboot自定義sftp連接池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring mvc中@PathVariable / 帶斜杠方式獲取
這篇文章主要介紹了spring mvc中@PathVariable / 帶斜杠方式獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
詳解Java?POI?excel自定義設(shè)置單元格格式
這篇文章主要介紹了Java?POI?excel設(shè)置單元格格式,自定義設(shè)置,設(shè)置單元格格式:來(lái)源_formats,更多數(shù)據(jù)類型從formats里面發(fā)現(xiàn),需要的朋友可以參考下2024-01-01
Java循環(huán)創(chuàng)建對(duì)象內(nèi)存溢出的解決方法
在Java中,如果在循環(huán)中不當(dāng)?shù)貏?chuàng)建大量對(duì)象而不及時(shí)釋放內(nèi)存,很容易導(dǎo)致內(nèi)存溢出(OutOfMemoryError),所以本文給大家介紹了Java循環(huán)創(chuàng)建對(duì)象內(nèi)存溢出的解決方法,需要的朋友可以參考下2025-01-01
java設(shè)計(jì)模式責(zé)任鏈模式原理案例詳解
一個(gè)事件需要經(jīng)過(guò)多個(gè)對(duì)象處理是一個(gè)挺常見的場(chǎng)景,譬如采購(gòu)審批流程,請(qǐng)假流程,軟件開發(fā)中的異常處理流程,web請(qǐng)求處理流程等各種各樣的流程,可以考慮使用責(zé)任鏈模式來(lái)實(shí)現(xiàn)2021-09-09
在Java中實(shí)現(xiàn)讓線程按照自己指定的順序執(zhí)行
這篇文章主要介紹了在Java中實(shí)現(xiàn)讓線程按照自己指定的順序執(zhí)行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06

