Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 26e508d

Browse files
testing jcraft session pool design
1 parent 0ee99b2 commit 26e508d

File tree

11 files changed

+270
-14
lines changed

11 files changed

+270
-14
lines changed

‎jcraft-demo/pom.xml‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<project xmlns="http://maven.apache.org/POM/4.0.0"
3-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
55
<modelVersion>4.0.0</modelVersion>
66

77
<groupId>com.zaccoding</groupId>
@@ -27,11 +27,20 @@
2727
<artifactId>jsch</artifactId>
2828
<version>0.1.54</version>
2929
</dependency>
30+
3031
<dependency>
3132
<groupId>org.apache.commons</groupId>
3233
<artifactId>commons-exec</artifactId>
3334
<version>1.3</version>
3435
</dependency>
36+
37+
<!-- apahce commons pool -->
38+
<dependency>
39+
<groupId>org.apache.commons</groupId>
40+
<artifactId>commons-pool2</artifactId>
41+
<version>2.6.0</version>
42+
</dependency>
43+
3544
<dependency>
3645
<groupId>junit</groupId>
3746
<artifactId>junit</artifactId>
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package ssh;
2+
3+
import com.jcraft.jsch.UserInfo;
4+
5+
/**
6+
* @author zacconding
7+
* @Date 2019年01月01日
8+
* @GitHub : https://github.com/zacscoding
9+
*/
10+
public class ServerDetails {
11+
12+
private String host;
13+
private String username;
14+
private int port;
15+
private int connectTimeOut;
16+
private String privateKey;
17+
18+
private UserInfoImpl userInfo;
19+
20+
public String getHost() {
21+
return host;
22+
}
23+
24+
public void setHost(String host) {
25+
this.host = host;
26+
}
27+
28+
public String getUsername() {
29+
return username;
30+
}
31+
32+
public void setUsername(String username) {
33+
this.username = username;
34+
}
35+
36+
public int getPort() {
37+
return port;
38+
}
39+
40+
public void setPort(int port) {
41+
this.port = port;
42+
}
43+
44+
public int getConnectTimeOut() {
45+
return connectTimeOut;
46+
}
47+
48+
public void setConnectTimeOut(int connectTimeOut) {
49+
this.connectTimeOut = connectTimeOut;
50+
}
51+
52+
public String getPrivateKey() {
53+
return privateKey;
54+
}
55+
56+
public void setPrivateKey(String privateKey) {
57+
this.privateKey = privateKey;
58+
}
59+
60+
public UserInfoImpl getUserInfo() {
61+
return userInfo;
62+
}
63+
64+
public void setUserInfo(UserInfoImpl userInfo) {
65+
this.userInfo = userInfo;
66+
}
67+
68+
public static class UserInfoImpl implements UserInfo {
69+
70+
private String user;
71+
private String password;
72+
73+
public String getUser() {
74+
return user;
75+
}
76+
77+
public void setUser(String user) {
78+
this.user = user;
79+
}
80+
81+
public void setPassword(String password) {
82+
this.password = password;
83+
}
84+
85+
@Override
86+
public String getPassphrase() {
87+
return password;
88+
}
89+
90+
@Override
91+
public String getPassword() {
92+
return password;
93+
}
94+
95+
@Override
96+
public boolean promptPassword(String message) {
97+
return true;
98+
}
99+
100+
@Override
101+
public boolean promptPassphrase(String message) {
102+
return true;
103+
}
104+
105+
@Override
106+
public boolean promptYesNo(String message) {
107+
return false;
108+
}
109+
110+
@Override
111+
public void showMessage(String message) {
112+
//
113+
}
114+
}
115+
116+
117+
}

‎jcraft-demo/src/main/java/ssh/ExecuteResult.java‎ renamed to ‎jcraft-demo/src/main/java/ssh/execute/ExecuteResult.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ssh;
1+
package ssh.execute;
22

33
/**
44
* @author zacconding
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ssh.pool;
2+
3+
/**
4+
* @author zacconding
5+
* @Date 2019年01月01日
6+
* @GitHub : https://github.com/zacscoding
7+
*/
8+
public class JSchSession {
9+
10+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package ssh.pool;
2+
3+
import com.jcraft.jsch.JSch;
4+
import com.jcraft.jsch.Session;
5+
import java.nio.charset.Charset;
6+
import org.apache.commons.pool2.BaseKeyedPooledObjectFactory;
7+
import org.apache.commons.pool2.PooledObject;
8+
import org.apache.commons.pool2.impl.DefaultPooledObject;
9+
import ssh.ServerDetails;
10+
11+
/**
12+
* @author zacconding
13+
* @Date 2019年01月01日
14+
* @GitHub : https://github.com/zacscoding
15+
*/
16+
public class JSchSessionFactory extends BaseKeyedPooledObjectFactory<ServerDetails, Session> {
17+
18+
@Override
19+
public Session create(ServerDetails serverDetails) throws Exception {
20+
// log.info("Create Session : hash : {}", serverDetails.hashCode());
21+
22+
JSch jSch = new JSch();
23+
24+
if (serverDetails.getPrivateKey() != null) {
25+
jSch.addIdentity(
26+
serverDetails.getHost(), serverDetails.getPrivateKey().getBytes(Charset.forName("UTF-8"))
27+
, null, null
28+
);
29+
}
30+
31+
Session session = jSch.getSession(
32+
serverDetails.getUsername(), serverDetails.getHost(), serverDetails.getPort()
33+
);
34+
session.setConfig("StrictHostKeyChecking", "no");
35+
36+
session.setUserInfo(serverDetails.getUserInfo());
37+
int timeout = serverDetails.getConnectTimeOut() >= 0 ? serverDetails.getConnectTimeOut() : 0;
38+
session.setTimeout(timeout);
39+
40+
if (serverDetails.getUserInfo().getPassword() != null) {
41+
session.setPassword(serverDetails.getUserInfo().getPassword());
42+
}
43+
44+
return session;
45+
}
46+
47+
@Override
48+
public PooledObject<Session> wrap(Session session) {
49+
return new DefaultPooledObject<>(session);
50+
}
51+
52+
@Override
53+
public void activateObject(ServerDetails key, PooledObject<Session> pool) throws Exception {
54+
Session session = pool.getObject();
55+
56+
if (session != null) {
57+
//log.info("Active session : {} - {}", simpleSessionInfo(session), session);
58+
session.connect();
59+
}
60+
}
61+
62+
@Override
63+
public boolean validateObject(ServerDetails key, PooledObject<Session> pool) {
64+
Session session = pool.getObject();
65+
66+
if (session != null) {
67+
// log.info("Connect session : {} - {}", simpleSessionInfo(session), session);
68+
return session.isConnected();
69+
}
70+
71+
return false;
72+
}
73+
74+
@Override
75+
public void destroyObject(ServerDetails key, PooledObject<Session> pool) throws Exception {
76+
Session session = pool.getObject();
77+
78+
if (session != null) {
79+
// log.info("DisConnect session : {} - {}", simpleSessionInfo(session), session);
80+
session.disconnect();
81+
}
82+
}
83+
84+
private String simpleSessionInfo(Session session) {
85+
if (session == null) {
86+
return "null";
87+
}
88+
89+
return new StringBuilder(session.getUserName())
90+
.append('@')
91+
.append(session.getHost())
92+
.append(':')
93+
.append(session.getPort())
94+
.toString();
95+
}
96+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package ssh.pool;
2+
3+
import com.jcraft.jsch.Session;
4+
import org.apache.commons.pool2.KeyedPooledObjectFactory;
5+
import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
6+
import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
7+
import ssh.ServerDetails;
8+
9+
/**
10+
* @author zacconding
11+
* @Date 2019年01月01日
12+
* @GitHub : https://github.com/zacscoding
13+
*/
14+
public class JSchSessionPool extends GenericKeyedObjectPool<ServerDetails, Session> {
15+
16+
public JSchSessionPool(KeyedPooledObjectFactory<ServerDetails, Session> factory) {
17+
super(factory, new GenericKeyedObjectPoolConfig<>());
18+
}
19+
20+
public JSchSessionPool(KeyedPooledObjectFactory<ServerDetails, Session> factory,
21+
GenericKeyedObjectPoolConfig<Session> config) {
22+
23+
super(factory, config);
24+
}
25+
}

‎jcraft-demo/src/main/java/ssh/JschClient.java‎ renamed to ‎jcraft-demo/src/main/java/ssh2222/JschClient.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ssh;
1+
package ssh2222;
22

33
import com.jcraft.jsch.Channel;
44
import com.jcraft.jsch.JSch;

‎jcraft-demo/src/main/java/ssh/JschExecutorHandler.java‎ renamed to ‎jcraft-demo/src/main/java/ssh2222/JschExecutorHandler.java‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
package ssh;
2-
1+
package ssh2222;
32

43
import java.io.File;
54
import java.io.IOException;
@@ -53,7 +52,7 @@ public JschExecutorHandler(Process process) {
5352

5453
@Override
5554
public void setExitValue(int value) {
56-
this.setExitValues(new int[]{value});
55+
this.setExitValues(new int[]{value});
5756
}
5857

5958
@Override
@@ -128,12 +127,14 @@ public int execute(CommandLine commandLine, Map<String, String> map) throws Exec
128127
}
129128

130129
@Override
131-
public void execute(CommandLine commandLine, ExecuteResultHandler executeResultHandler) throws ExecuteException, IOException {
130+
public void execute(CommandLine commandLine, ExecuteResultHandler executeResultHandler)
131+
throws ExecuteException, IOException {
132132

133133
}
134134

135135
@Override
136-
public void execute(CommandLine commandLine, Map<String, String> map, ExecuteResultHandler executeResultHandler) throws ExecuteException, IOException {
136+
public void execute(CommandLine commandLine, Map<String, String> map, ExecuteResultHandler executeResultHandler)
137+
throws ExecuteException, IOException {
137138

138139
}
139140

‎jcraft-demo/src/main/java/ssh/JschSession.java‎ renamed to ‎jcraft-demo/src/main/java/ssh2222/JschSession.java‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ssh;
1+
package ssh2222;
22

33
import com.jcraft.jsch.Channel;
44
import com.jcraft.jsch.ChannelExec;
@@ -18,7 +18,6 @@
1818
public class JschSession implements RemoteSession {
1919

2020
private Object rwMutex;
21-
2221
private final Session sock;
2322
private Queue<Channel> channels;
2423

‎jcraft-demo/src/main/java/ssh/RemoteSession.java‎ renamed to ‎jcraft-demo/src/main/java/ssh2222/RemoteSession.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package ssh;
1+
package ssh2222;
22

33
import java.io.IOException;
44

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /