Утечка памяти при загрузке и скачивании файла (может быть из-за использования ChannelSftp.get ("имя_файла"))? - PullRequest
1 голос
/ 23 сентября 2019

Подскажите, пожалуйста, внутреннюю работу ChannelSftp.get( "file_name")?Будет ли использование этой функции для получения одного файла из списка файлов (600 файлов по 10 КБ) вызвать проблемы утечки памяти в Tomcat8, если эта функция используется часто?

Это код, которыйиспользуется для загрузки и извлечения файлов с удаленного сервера.

public String connectRemote(String host, String user, String password, String 
    remotePath, String sFileName) throws IOException, JSchException, SftpException 
{
    try {
        String sFileNames ="";
        Session session = connectSFTP(host, user, password);

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp chan = (ChannelSftp) channel;

        try {

            String ftpRemoteDirectory = "/Irismedical/Outbox_Eligibility";

            chan.cd(ftpRemoteDirectory);

            File ftest = new File(sFileName);

            chan.put(new FileInputStream(ftest), ftest.getName());

            sFileNames =  ftest.getName();

        }
        catch (Exception e) {
            chan.disconnect();
            session.disconnect();
            return null;
        }

        chan.cd("/Irismedical/Inbox/Eligibility");

        String sRes = null;
        for (int i = 0;i<6 ; i++) {

            try {
                  sRes = convertInputStreamToString(
                             chan.get(sFileNames+"_Response_271_1.edi"));

                 if (sRes  != null ) {

                     break;

            } catch (Exception e ) {
                if (i<3) {
                    Thread.sleep(3000);
                } else {
                    Thread.sleep(5000);
                }
            }
        }
                    session.disconnect();

        return sRes;
    }
    catch (Exception e) {
        }
        return null;
    }
}

private static String convertInputStreamToString(InputStream inputStream) 
    throws IOException {

    ByteArrayOutputStream result = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) != -1) {
        result.write(buffer, 0, length);
    }

    return result.toString(StandardCharsets.UTF_8.name());
}

1 Ответ

0 голосов
/ 23 сентября 2019

Вы должны утилизировать потоки.

И FileInputStream в вашем коде загрузки, и InputStream, возвращаемое ChannelSftp.get в вашем коде загрузки.

См. Удаление потоков в Java .

...