Несколько загрузок файлов из SFTP с использованием JSch завершаются с ошибкой "Очередь запросов: неизвестная проблема с запросом"
Я пытаюсь загрузить несколько файлов с FTP-сервера. Это работает хорошо, когда я просто помещаю это через цикл. Я не знаю размер файла, который может варьироваться, может быть слишком маленьким или слишком большим. Итак, я загружаю их, используя службу executor. Когда я ставлю функцию загрузки через исполнителя, я получаю Очередь запросов: Неизвестная проблема запроса. Пожалуйста, дайте мне знать, где я иду не так.
System.out.println("Connecting to FTP Server");
Session session = null;
ChannelSftp channelSftp = null;
JSch jsch = new JSch();
session = jsch.getSession(sftpUser,sftpHost,22);
session.setPassword(sftpPassword);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
System.out.println("Session Connected Status: "+session.isConnected());
Channel channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp)channel;
System.out.println("Channel Connected Status: "+channelSftp.isConnected());
System.out.println("File: "+sourceFilePath);
if(channelSftp.isConnected())
{
String path = this.propertyManager.getValue("targetDirectoryPath");
channelSftp.cd(path);
Vector filelist = channelSftp.ls(path);
for(int i=0; i<filelist.size();i++)
{
LsEntry entry = (LsEntry) filelist.get(i);
String fileName = sourceFilePath + entry.getFilename();
destinationFilePath = ShipmentUtils.getDownloadPath(entry.getFilename());
System.err.println(entry.getFilename());
exec.execute(new FileDownloader(destinationFilePath, channelSftp.get(fileName)));
}
}
channelSftp.disconnect();
session.disconnect();
Вот класс загрузчика
private class FileDownloader implements Runnable
{
String destinationFilePath;
InputStream stream;
public FileDownloader(String destinationFilePath , InputStream stream) {
this.destinationFilePath = destinationFilePath;
this.stream = stream;
}
@Override
public void run() {
byte[] buffer = new byte[1024];
BufferedOutputStream bos = null;
BufferedInputStream bis = null ;
try
{
bis = new BufferedInputStream(stream);
File newFile = new File(destinationFilePath);
OutputStream os = new FileOutputStream(newFile);
bos = new BufferedOutputStream(os);
int readCount=0;
while( (readCount = bis.read(buffer)) > 0) {
bos.write(buffer, 0, readCount);
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if(bis != null) bis.close();
if(bos != null) bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Это ошибка
java.io.IOException: error: 4: RequestQueue: unknown request id 1399811183
at com.jcraft.jsch.ChannelSftp$2.read(ChannelSftp.java:1406)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at com.shipmentprocessing.network.FTPConnector$FileDownloader.run(FTPConnector.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.io.IOException: error
at com.jcraft.jsch.ChannelSftp$2.close(ChannelSftp.java:1505)
at java.io.BufferedInputStream.close(Unknown Source)
at com.shipmentprocessing.network.FTPConnector$FileDownloader.run(FTPConnector.java:150)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
1 ответ
Хотя вы можете использовать одно соединение SFTP / сеанс JSch для нескольких загрузок, сеанс JSch определенно не является поточно-ориентированным.
Поэтому, если вам нужно запустить загрузку отдельными потоками, вы должны открыть новое соединение для (в) каждого потока. Ваша производительность загрузки будет намного лучше и в этом случае.