由于需要下载大量的小文件,使用Jsch开发了一个小型Sftp连接池。
主要思路是使用类的静态变量HashMap用于保持session,缺少守护线程管理。
压测后效果很明显,但当在同一目录上传的文件超过1000个以后下载速度变慢,将同目录下文件删除以后速度又回升。由此推测出是文件太多导致文件检索变慢
1.main方法,新建一个线程池,用于接收报文
线程池介绍链接:http://www.crazyant.net/2124.html?uwtoli=ohppy
package com.cgb.Main;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import com.cgb.Util.Log;
import com.cgb.Util.ReadProperties;
public class SocketMain {
public static Logger logger = Log.getLogger(SocketMain.class);
public static ExecutorService ex = Executors.newFixedThreadPool(ReadProperties.getThreadPoolSize());
public static void main(String[] args) throws IOException {
// 端口号
final int port = ReadProperties.getServerPort();
ServerSocket socket = null;
try {
// 绑定端口号
socket = new ServerSocket(port);
while(true){
Socket clientSocket = socket.accept();
logger.info("有一个客户端连接");
ex.execute(new XmlRecv(clientSocket));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
socket.close();
ex.shutdown();
}
}
}
2.报文的接收类:
package com.cgb.Main;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import org.apache.log4j.Logger;
import com.cgb.Util.Log;
import com.cgb.Util.ReadProperties;
import com.cgb.Util.XmlUtil;
public class XmlRecv extends Thread {
private BufferedOutputStream out;
private InputStreamReader in;
private Socket socket;
private boolean result = false;
public static Logger logger = Log.getLogger(XmlRecv.class);
@Override
public void run() {
String charSet = ReadProperties.getCharSet();
try {
// 保存输入流
in = new InputStreamReader(socket.getInputStream(), charSet);
// 准备输出流
out = new BufferedOutputStream(socket.getOutputStream());
// 翻译接收到的报文,并执行SFTP操作
XmlTranslate xmlTranslate = new XmlTranslate(in);
logger.info("开始进行报文检查");
result = xmlTranslate.checkXml();
// 输出应答报文
out.write(XmlUtil.retrunXml(charSet, result, "0000", "文件传输成功!")
.getBytes(charSet));
out.flush();
socket.close();
} catch (UnsupportedEncodingException e) {
logger.info(Log.getTrace(e));
e.printStackTrace();
} catch (IOException e) {
logger.info(Log.getTrace(e));
e.printStackTrace();
}
}
public XmlRecv(Socket clientSocket) {
this.socket = clientSocket;
}
}
3.报文的翻译,解析
package com.cgb.Main;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.cgb.Bean.SftpInfo;
import com.cgb.Service.SftpService;
import com.cgb.Util.Log;
import com.cgb.Util.XmlUtil;
public class XmlTranslate {
private InputStreamReader in;
public static Logger logger = Log.getLogger(XmlTranslate.class);
public static ExecutorService ex = Executors.newFixedThreadPool(20);
public InputStreamReader getIn() {
return in;
}
public void setIn(InputStreamReader in) {
this.in = in;
}
public XmlTranslate(InputStreamReader in) {
super();
this.in = in;
}
public boolean checkXml(){
BufferedReader bufferedReader = new BufferedReader(this.in);
try {
/*while((lsStr = bufferedReader.readLine())!=null){
//追加到字符串缓冲区存放
xmlStr.append(lsStr);
}*/
// 先读取8位长度
char[] cha = new char[8];
bufferedReader.read(cha, 0, 8);
String xmlLength = String.valueOf(cha);
// 正则去除字符串中的0
xmlLength = xmlLength.replaceAll("^(0+)", "");
logger.debug(&#