Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Подскажите по работе с фтп, замучался уже :( / 6 сообщений из 6, страница 1 из 1
06.10.2015, 07:40
    #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
06.10.2015, 09:23
    #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
06.10.2015, 09:24
    #39068999
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите по работе с фтп, замучался уже :(
korshun,

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


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