powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите по работе с фтп, замучался уже :(
6 сообщений из 6, страница 1 из 1
Подскажите по работе с фтп, замучался уже :(
    #39068946
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собсно сабж.
Стоит задача раза 3 в минуту лезть на фтп в определенную папку, в этой папке еще десяток вложенных папок, в каждой из них текстовый файл. Надо в каждой папке проверить этот файл и в определенном случае на основании данных в нем, сформировать xls файл.

Код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
    private void checkRequests() {

        // если соединение активно - выполняем необходимые действия
        if(isConnect()) {

            // получаем список всех папок пользователей
            FTPFile[] ftpDirs;
            try {
                ftpDirs =                                               ftpClient.listDirectories();
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }


            // если их кол-во больше нуля, то начинаем их просмотр
            if (ftpDirs.length > 0) {

                for (FTPFile ftpUserDir : ftpDirs) {

                    if (ftpUserDir.isDirectory()) {

                        String ftpUserDirName =                         ftpUserDir.getName();

                        if (ftpUserDirName.equals(".") || ftpUserDirName.equals("..")) {
                            continue;
                        }

                        // задаем путь к файлу, в который пишется номер объекта
                        String requestFilePath =                        ftpUserDirName + "/" + FTP_REQUEST_FILE;

                        //  считываем в буфер содержимое этого файла
                        BufferedReader requestFileReader;
                        try {
                            requestFileReader =                         new BufferedReader(new InputStreamReader(ftpClient.retrieveFileStream(requestFilePath)));
                        } catch (IOException e) {
                            e.printStackTrace();
                            return;
                        }

                        try {
                            if (!ftpClient.completePendingCommand()) {
                                try {
                                    throw new Exception("Pending command failed: " + ftpClient.getReplyString());
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                            return;
                        }

                        String requestObject;
                        try {
                            requestObject =                             requestFileReader.readLine();
                        } catch (IOException e) {
                            e.printStackTrace();
                            return;
                        }

                        //  если первая строка не null - значит файл существует
                        if (requestObject != null) {

                            //  если в файле записано число, отличное от нуля, значит есть запрос на сигналы
                            if (!requestObject.equals("0")) {

                                //  так же точно проверяем наличие excel файла
                                String requestXlsFilePath =             ftpUserDirName + "/" + requestObject + ".xls";
                                BufferedReader xlsFile;
                                try {
                                    xlsFile =                           new BufferedReader(new InputStreamReader(ftpClient.retrieveFileStream(requestXlsFilePath)));
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    return;
                                }

                                try {
                                    if (!ftpClient.completePendingCommand()) {
                                        try {
                                            throw new Exception("Pending command failed (!requestObject.equals(\"0\")): " + ftpClient.getReplyString());
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }
                                    }
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    return;
                                }

                                //  если файл excel есть - значит мы его уже сформировали, ничего делать не надо
                                try {

                                    //  если файла excel нет - надо его формировать
                                    if (xlsFile.readLine() == null) {

                                        File createXlsFile =            null;

                                        // формируем excel файл с сигналами
                                        try {
                                            createXlsFile =             createExcelFile(requestObject);
                                        } catch (WriteException e) {
                                            e.printStackTrace();
                                        }

                                        // если файл с сигналами создался загружаем его на фтп
                                        if (createXlsFile != null) {

                                            String firstRemoteFile =    ftpUserDirName + "/" + requestObject + ".xls";
                                            InputStream inputStream =   new FileInputStream(createXlsFile);

                                            try {
                                                ftpClient.storeFile(firstRemoteFile, inputStream);
                                            } catch (IOException e) {
                                                try {
                                                    ftpClient.storeFile(firstRemoteFile, inputStream);
                                                } catch (IOException e1) {
                                                    try {
                                                        ftpClient.storeFile(firstRemoteFile, inputStream);
                                                    } catch (IOException e2) {
                                                        e2.printStackTrace();
                                                    }
                                                }
                                            } finally {
                                                inputStream.close();
                                                createXlsFile.delete();
                                            }

                                        }

                                    }
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    return;
                                }

                                try {
                                    xlsFile.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                    return;
                                }

                            }

                        }

                        try {
                            requestFileReader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                            return;
                        }

                    }

                }

            }

        }


        // если соединение неактивно - подключаемся к фтп
        else {
            ftpConnect();
        }

    }




В общем все это реализовано, даже работает как надо, НО работает примерно сутки, после чего при входе в одну из папок намертво висит на вот этом блоке:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
                        try {
                            if (!ftpClient.completePendingCommand()) {
                                try {
                                    throw new Exception("Pending command failed: " + ftpClient.getReplyString());
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                            return;
                        }



Причем висит именно на команде ftpClient.completePendingCommand(), ибо не в блок try, ни в блок catch я не попадаю.
Пробовал установить все возможные таймауты
Код: java
1.
2.
3.
ftpClient.setControlKeepAliveReplyTimeout(FTP_CONNECT_TIMEOUT);
ftpClient.setControlKeepAliveTimeout(FTP_CONNECT_TIMEOUT);
ftpClient.setDataTimeout(FTP_CONNECT_TIMEOUT);


- бесполезно.
Посмотрите пожалуйста мой говнокод, мож туплю где :(
Заранее благодарю!
...
Рейтинг: 0 / 0
Подскажите по работе с фтп, замучался уже :(
    #39068997
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshun
Код: java
1.
2.
3.
4.
5.
                                try {
                                    throw new Exception("Pending command failed: " + ftpClient.getReplyString());
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }


Это, конечно пять. Thread.dumpStack(), ну или, на худой конец, new Exception().printStackTrace(); Выбрасывать и тут же ловить не за чем.
...
Рейтинг: 0 / 0
Подскажите по работе с фтп, замучался уже :(
    #39068999
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshun,

Во время отладки при зависании нажмите в отладчике на паузу и посмотрите что именно там происходит по стеку.
...
Рейтинг: 0 / 0
Подскажите по работе с фтп, замучался уже :(
    #39069003
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, спасибо.
У меня тут уже мысль появилась, но что бы проверить, придется ждать до завтрашнего дня, до следующего зависания))
...
Рейтинг: 0 / 0
Подскажите по работе с фтп, замучался уже :(
    #39069022
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korshunОк, спасибо.
У меня тут уже мысль появилась, но что бы проверить, придется ждать до завтрашнего дня, до следующего зависания))
Научитесь снимать дамп потоков работающего приложения.
...
Рейтинг: 0 / 0
Подскажите по работе с фтп, замучался уже :(
    #39069111
korshun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите по работе с фтп, замучался уже :(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]