Skip to content

Commit 7e241e9

Browse files
committed
feat: 添加基于 hutool、commons-pool2 的 ftp 工具
1 parent 6e94d62 commit 7e241e9

2 files changed

Lines changed: 151 additions & 0 deletions

File tree

common/plugin/storage/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,9 @@
2121
<groupId>org.dromara.x-file-storage</groupId>
2222
<artifactId>x-file-storage-spring</artifactId>
2323
</dependency>
24+
<dependency>
25+
<groupId>org.apache.commons</groupId>
26+
<artifactId>commons-pool2</artifactId>
27+
</dependency>
2428
</dependencies>
2529
</project>
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package com.github.cadecode.uniboot.common.plugin.storage.util;
2+
3+
import cn.hutool.extra.ftp.AbstractFtp;
4+
import org.apache.commons.pool2.BasePooledObjectFactory;
5+
import org.apache.commons.pool2.PooledObject;
6+
import org.apache.commons.pool2.PooledObjectFactory;
7+
import org.apache.commons.pool2.impl.DefaultPooledObject;
8+
import org.apache.commons.pool2.impl.GenericObjectPool;
9+
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
10+
11+
import java.util.Objects;
12+
import java.util.function.Consumer;
13+
import java.util.function.Supplier;
14+
15+
/**
16+
* FTP 连接池工具类
17+
*
18+
* @author Cade Li
19+
* @date 2023/11/23
20+
*/
21+
public class FtpPoolUtil {
22+
23+
/**
24+
* 获取一个 FTP 连接池
25+
*
26+
* @param connectionNum 连接数量
27+
* @param supplier 创建 AbstractFtp 方式
28+
* @return FtpPool
29+
*/
30+
public static FtpPool initPool(int connectionNum, Supplier<AbstractFtp> supplier) {
31+
return initPool(connectionNum, connectionNum, supplier);
32+
}
33+
34+
public static FtpPool initPool(int minConnectionNum, int maxConnectionNum, Supplier<AbstractFtp> supplier) {
35+
FtpFactory ftpFactory = new FtpFactory(supplier);
36+
GenericObjectPoolConfig<AbstractFtp> config = new GenericObjectPoolConfig<>();
37+
// 设置连接数量
38+
config.setMaxTotal(minConnectionNum);
39+
config.setMinIdle(maxConnectionNum);
40+
// 设置为阻塞获取
41+
config.setMaxWaitMillis(-1L);
42+
return new FtpPool(ftpFactory, config);
43+
}
44+
45+
/**
46+
* 关闭 FTP 连接池
47+
*
48+
* @param pool 连接池
49+
*/
50+
public static void closePool(FtpPool pool) {
51+
if (Objects.nonNull(pool)) {
52+
pool.close();
53+
}
54+
}
55+
56+
/**
57+
* 获取一个 FTP 连接
58+
*
59+
* @param pool 连接池
60+
* @return AbstractFtp
61+
*/
62+
public static AbstractFtp takeFtp(FtpPool pool) {
63+
try {
64+
return pool.borrowObject();
65+
} catch (Exception e) {
66+
throw new RuntimeException(e);
67+
}
68+
}
69+
70+
/**
71+
* 还回一个 FTP 连接
72+
*
73+
* @param pool 连接池
74+
* @param ftp FTP 连接
75+
*/
76+
public static void returnFtp(FtpPool pool, AbstractFtp ftp) {
77+
if (Objects.nonNull(ftp)) {
78+
pool.returnObject(ftp);
79+
}
80+
}
81+
82+
/**
83+
* 获取一个 FTP 连接并消费
84+
*
85+
* @param pool 连接池
86+
* @param consumer FTP 消费者
87+
*/
88+
public static void useFtp(FtpPool pool, Consumer<AbstractFtp> consumer) {
89+
AbstractFtp ftp = null;
90+
try {
91+
ftp = takeFtp(pool);
92+
consumer.accept(ftp);
93+
} finally {
94+
returnFtp(pool, ftp);
95+
}
96+
}
97+
98+
/**
99+
* FTP 工厂
100+
*/
101+
public static class FtpFactory extends BasePooledObjectFactory<AbstractFtp> {
102+
103+
private final Supplier<AbstractFtp> supplier;
104+
105+
public FtpFactory(Supplier<AbstractFtp> supplier) {
106+
this.supplier = supplier;
107+
}
108+
109+
@Override
110+
public AbstractFtp create() {
111+
return supplier.get();
112+
}
113+
114+
@Override
115+
public PooledObject<AbstractFtp> wrap(AbstractFtp ftp) {
116+
return new DefaultPooledObject<>(ftp);
117+
}
118+
119+
@Override
120+
public void destroyObject(PooledObject<AbstractFtp> p) throws Exception {
121+
// 关闭连接
122+
p.getObject().close();
123+
super.destroyObject(p);
124+
}
125+
126+
@Override
127+
public boolean validateObject(PooledObject<AbstractFtp> p) {
128+
// 测试连接状态
129+
try {
130+
p.getObject().pwd();
131+
} catch (Exception e) {
132+
return false;
133+
}
134+
return super.validateObject(p);
135+
}
136+
}
137+
138+
/**
139+
* FTP Pool
140+
*/
141+
public static class FtpPool extends GenericObjectPool<AbstractFtp> {
142+
143+
public FtpPool(PooledObjectFactory<AbstractFtp> factory, GenericObjectPoolConfig<AbstractFtp> config) {
144+
super(factory, config);
145+
}
146+
}
147+
}

0 commit comments

Comments
 (0)