基于jsch简单封装,并提供连接池功能,使用简单,基于SPI机制,实现定制化。
<!--sftp--> <dependency> <groupId>com.jccfc</groupId> <artifactId>sftp-spring-boot-starter</artifactId> <version>1.0.0</version> </dependency>
#1:配置,如#客户端1sftp.clients.client1.host = 127.0.0.0sftp.clients.client1.port = 22sftp.clients.client1.username = taskftp sftp.clients.client1.password = 1111111sftp.clients.client1.path = /opt/upload/#:2:调用 /** SFTP 客户端*/ @Autowired private SftpClient sftpClient; /** * 文件传输 * <li>上传文件到sftp服务器传输</li> * @author duanyong@jccfc.com * @date 2020/5/15 11:14 * @param channel: 渠道ID * @param fileName: 文件名 * @param inputStream: 待上传的文件输入流 */ public void transFile(final String channel,final String fileName, final InputStream inputStream){ sftpClient.run(channel,sftpTemplate->{ sftpTemplate.upload(fileName,inputStream); }); } /** * 判断文件是否存在 * <li>指定sftp文件路径和文件名,判断改文件是否存在当前指定的sftp目录下,若存在返回true,否则返回false</li> * @author duanyong@jccfc.com * @date 2020/5/15 13:51 * @param channel:渠道ID * @param sftpDir:sftp目录 * @param fileName:文件名 * @return: boolean */ public boolean exists(String channel, String sftpDir, String fileName) throws Exception { return sftpClient.runAndReturn(channel,sftpTemplate->{ try { sftpTemplate.cd(sftpDir); } catch (SftpClientException exception) { if (ChannelSftp.SSH_FX_NO_SUCH_FILE == exception.id) { log.info("目录不存在...新建目录:{}",sftpDir); sftpTemplate.mkdirs(sftpDir); return false; } } if (sftpTemplate.isExist(fileName)) { // 文件是否存在 log.info("{}文件存在...",fileName); return true; } return false; }); }### 配置参数说明
/** * 池配置 */ @NestedConfigurationProperty private Pool pool = new Pool(); /** * sftp服务器配置 */ private Map<String, SftpClientConfig> clients = new LinkedHashMap<>(); sftp服务器配置 /** * 主机ip */ private String host; /** * 端口号 */ private int port = 22; /** * 用户名 */ private String username; /** * 密码 */ private String password; /** * 路径 */ private String path;
pool 池配置
/** * 对象最大数量 * 默认值是8 */ private int maxTotal = DEFAULT_MAX_TOTAL; /** * 最大空闲对象数量 * 默认值是8 */ private int maxIdle = DEFAULT_MAX_IDLE; /** * 最小空闲对象数量 * 默认值是0 */ private int minIdle = DEFAULT_MIN_IDLE; /** * 对象池存储空闲对象是使用的LinkedBlockingDeque,它本质上是一个支持FIFO和FILO的双向的队列, * common-pool2中的LinkedBlockingDeque不是Java原生的队列,而有common-pool2重新写的一个双向队列。 * 如果为true,表示使用FIFO获取对象。 * 默认值是true */ private boolean lifo = DEFAULT_LIFO; /** * common-pool2实现的LinkedBlockingDeque双向阻塞队列使用的是Lock锁。 * 这个参数就是表示在实例化一个LinkedBlockingDeque时,是否使用lock的公平锁。 * 默认值是false */ private boolean fairness = DEFAULT_FAIRNESS; /** * 当没有空闲连接时,获取一个对象的最大等待时间。如果这个值小于0,则永不超时,一直等待,直到有空闲对象到来。 * 如果大于0,则等待maxWaitMillis长时间,如果没有空闲对象,将抛出NoSuchElementException异常。 * 可以根据需要自己调整,单位是毫秒。 * 默认值是5000L */ private long maxWaitMillis = DEFAULT_MAX_WAIT_MILLIS; /** * 对象最小的空闲时间。如果为小于等于0,最Long的最大值,如果大于0,当空闲的时间大于这个值时,执行移除这个对象操作。 * 可以避免连接泄漏 * 默认值是-1 */ private long minEvictableIdleTimeMillis = DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS; /** * shutdown驱逐线程的超时时间。当创建驱逐线(evictor)程时,如发现已有一个evictor正在运行则会停止该evictor, * evictorShutdownTimeoutMillis表示当前线程需等待多长时间让ScheduledThreadPoolExecutor停止该evictor线程。 * (evictor继承自TimerTask,由ScheduledThreadPoolExecutor进行调度) * 默认值是10000L,即10秒 */ private long evictorShutdownTimeoutMillis = DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT_MILLIS; /** * 对象最小的空间时间,如果小于等于0,取Long的最大值,如果大于0,当对象的空闲时间超过这个值, * 并且当前空闲对象的数量大于最小空闲数量(minIdle)时,执行移除操作。 * 这个和上面的minEvictableIdleTimeMillis的区别是,它会保留最小的空闲对象数量。而上面的不会,是强制性移除的。 * 默认值是1000L * 60L * 30L,即30分钟 */ private long softMinEvictableIdleTimeMillis = DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS; /** * 检测空闲对象线程每次检测的空闲对象的数量。如果这个值小于0,则每次检测的空闲对象数量等于当前空闲对象数量除以这个值的绝对值,并对结果向上取整。 * 默认值是3 */ private int numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN; /** * 在创建对象时检测对象是否有效,true是,默认值是false。做了这个配置会降低性能。 * 默认值是false */ private boolean testOnCreate = DEFAULT_TEST_ON_CREATE; /** * 在从对象池获取对象时是否检测对象有效,true是;默认值是false。做了这个配置会降低性能。 * 默认值是false */ private boolean testOnBorrow = DEFAULT_TEST_ON_BORROW; /** * 在向对象池中归还对象时是否检测对象有效,true是,默认值是false。做了这个配置会降低性能。 * 默认值是false */ private boolean testOnReturn = DEFAULT_TEST_ON_RETURN; /** * 在检测空闲对象线程检测到对象不需要移除时,是否检测对象的有效性。 * true是,默认值是false。建议配置为true,不影响性能,并且保证安全性。 * 默认值是true */ private boolean testWhileIdle = DEFAULT_TEST_WHILE_IDLE; /** * 空闲对象检测线程的执行周期,即多长时间执行一次空闲对象检测。 * 单位是毫秒数。如果小于等于0,则不执行检测线程。 * 默认值是1000L * 60L * 10L,即10分钟 */ private long timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS; /** * 当对象池没有空闲对象时,新的获取对象的请求是否阻塞。true阻塞。 * 默认值是true */ private boolean blockWhenExhausted = DEFAULT_BLOCK_WHEN_EXHAUSTED; /** * 是否注册JMX * 默认值是true */ private boolean jmxEnabled = DEFAULT_JMX_ENABLE; /** * JMX前缀 * 默认值是pool */ private String jmxNamePrefix = DEFAULT_JMX_NAME_PREFIX; /** * 使用jmxNameBase + jmxNamePrefix + i来生成ObjectName * 默认值是sftp */ private String jmxNameBase = DEFAULT_JMX_NAME_BASE;
路漫漫其修远兮,吾将上下而求索 码云:https://gitee.com/javacoo/sftp-spring-boot-starter QQ:164863067作者/微信:javacoo 邮箱:xihuady@126.com
https://gitee.com/javacoo/sftp-spring-boot-starter
2023-12-13T11:46:19
2023-12-13T11:48:22
2024-01-02T09:07:42
2024-01-02T09:07:20
2024-01-02T09:06:50
2024-01-02T09:06:26
2024-01-02T09:06:01
2024-01-02T09:05:20
2024-01-02T09:04:49
2024-01-02T09:04:17