Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Algoritmer
155 / 95 / 24
Регистрация: 07.03.2013
Сообщений: 493
Записей в блоге: 1
1

Продолжение работы кода после падения

06.04.2016, 08:29. Просмотров 374. Ответов 5

Написал программу для авторестарта и отправки команд по расписанию для списка серверов. Список серверов вытягивается из mysql. Оттуда же вытягиваются команды и моменты времени, когда их нужно выполнить.

Принцип работы такой: каждые 5 секунд по таймеру вытягивается список команд и выполняется. Проблема в том, что если какой-то сервер оказался недоступен, а мы ему попытались отправить команду, то java вываливает ошибки. Иногда после этого выполнение кода продолжается, а иногда нет.

Как достичь того, чтобы если на текущей итерации (или на текущем тике) таймера возникла ошибка, следующая итерация таймера всё равно выполнилась?

Буду признателен за помощь
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2016, 08:29
Ответы с готовыми решениями:

Продолжение работы метода после вызова из его кода второго
Здравствуйте, У меня возникла проблема такого плана. Первый метод вызывает второй. И мне нужно,...

Продолжение работы после исключения
Здравствуйте. Возникла следующая ситуация: обрабатываю исключение в программе (пусть будет деление...

Продолжение работы после исключения
Комрады, объясните такую вещьч - есть скрипт, который запускается раз в сутки, смотрит в БД пути...

Продолжение работы StreamWriter после завершения
Нужно сделать так что бы: while { StreamWriter sw = new StreamWriter(myTempFile); ...

Продолжение работы программы после writeln
Как сделать чтобы программа после вывода writeln дальше работала?почему в процедуре не работает...

5
KEKCoGEN
Эксперт Java
2181 / 2033 / 526
Регистрация: 28.12.2010
Сообщений: 8,041
06.04.2016, 08:44 2
Algoritmer, где то вы не перехватываете исключение. Более подробно трудно сказать без кода.
0
Algoritmer
155 / 95 / 24
Регистрация: 07.03.2013
Сообщений: 493
Записей в блоге: 1
07.04.2016, 07:02  [ТС] 3
KEKCoGEN, в том то и дело, что вроде бы везде перехватываю. Привожу код проблемного модуля SCTask.java (верхний уровень возникновения ошибки) и лог, который вываливает Eclipse
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
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class SCTask extends TimerTask {
 
    @Override
    public void run() 
    {
        // TODO Auto-generated method stub
        //System.out.println("Таймер сработал");
        System.out.println();
        System.out.println();
        System.out.println("run "+(new Date()));
        ResultSet qset = ServerManage.execQuery("SELECT `id`, `fid`, `id_serv`, `next_exec`," +
                " `id_user`, `period_pp`, `caption_com`, `command`, `active` FROM `raspisanie`" +
                " WHERE active=1 and next_exec<=NOW()",true);
        
        try {
            qset.beforeFirst();
            while (qset.next()) {
                String cmd = qset.getString(8);
                String fid = qset.getString(2);
                String id_serv = qset.getString(3);
                //System.out.println(cmd+" "+fid+" "+id_serv+" "+qset.getString(4));
                String id = qset.getString(1);              
                Long time = qset.getTimestamp(4).getTime();             
                time = time + qset.getInt(6)*1000;      
                Date newdate = new Date(time);
                Date currentDate=new Date();
                while(newdate.before(currentDate)) //меньше текущей
                {
                    time = time + qset.getInt(6)*1000;
                    newdate = new Date(time);
                }
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");             
                //System.out.println("currentDate = " + sdf.format(newdate));
                ServerManage.execQuery("UPDATE `raspisanie` SET `next_exec`='"+
                        sdf.format(newdate)+"' where `id`="+id,false);
                if(cmd.equals("restart") || cmd.equals("#restart"))
                {
                    try
                    {
                        ServerManage.stop(fid);
                    } catch(Exception e){}
                    try {
                        ServerManage.start(fid, id_serv);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }                   
                }
                else
                {
                    try
                    {
                        ServerManage.sCommand(fid, cmd);
                    }
                    catch(Exception e){}
                }
                                
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }   
}
ЛогЭклипса оформляю как баш (ибо не знаю, как оформить по-другому)
Bash
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
170
171
172
run Thu Apr 07 05:36:20 EET 2016
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
command executed
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
command executed
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
command executed
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
command executed
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
C:\Arma2\instance_id4\BattlEye\BEServer_active_5134.cfg
C:\Arma2/instance_id4/BattlEye/BEServer.cfg
login success
command executed
C:\Arma2/instance_id6/BattlEye/BEServer.cfg
C:\Arma2\instance_id6\BattlEye\BEServer.cfg
C:\Arma2/instance_id6/BattlEye/BEServer.cfg
java.net.PortUnreachableException: ICMP Port Unreachable
Error when logging in.
    at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
    at java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:120)
    at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:144)
    at java.net.DatagramSocket.receive(DatagramSocket.java:812)
    at protocol.BEProtocol.receive(BEProtocol.java:150)
    at ServerManage.login(ServerManage.java:132)
    at ServerManage.isConnect(ServerManage.java:114)
    at ServerManage.isActive(ServerManage.java:204)
    at ServerManage.sCommand(ServerManage.java:209)
    at ServerManage.stop(ServerManage.java:101)
    at SCTask.run(SCTask.java:47)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
C:\Arma2/instance_id6/BattlEye/BEServer.cfg
C:\Arma2\instance_id6\BattlEye\BEServer.cfg
C:\Arma2/instance_id6/BattlEye/BEServer.cfg
java.net.PortUnreachableException: ICMP Port Unreachable
    at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
    at java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:120)
    at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:144)
    at java.net.DatagramSocket.receive(DatagramSocket.java:812)
    at protocol.BEProtocol.receive(BEProtocol.java:150)
    at ServerManage.login(ServerManage.java:132)
    at ServerManage.isConnect(ServerManage.java:114)
    at ServerManage.isActive(ServerManage.java:204)
    at ServerManage.start(ServerManage.java:94)
    at SCTask.run(SCTask.java:50)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Error when logging in.
C:\Arma2/instance_id2/BattlEye/BEServer.cfg
C:\Arma2\instance_id2\BattlEye\BEServer_active_45e8.cfg
C:\Arma2/instance_id2/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id2/BattlEye/BEServer.cfg
C:\Arma2\instance_id2\BattlEye\BEServer_active_45e8.cfg
C:\Arma2/instance_id2/BattlEye/BEServer.cfg
login success
command executed
C:\Program Files (x86)\Steam\steamapps\common\Arma 3/instance_id11/BattlEye/BEServer.cfg
C:\Program Files (x86)\Steam\steamapps\common\Arma 3\instance_id11\BattlEye\BEServer.cfg
C:\Program Files (x86)\Steam\steamapps\common\Arma 3/instance_id11/BattlEye/BEServer.cfg
java.net.PortUnreachableException: ICMP Port Unreachable
    at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
    at java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:120)
    at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:144)
    at java.net.DatagramSocket.receive(DatagramSocket.java:812)
    at protocol.BEProtocol.receive(BEProtocol.java:150)
    at ServerManage.login(ServerManage.java:132)
    at ServerManage.isConnect(ServerManage.java:114)
    at ServerManage.isActive(ServerManage.java:204)
    at ServerManage.sCommand(ServerManage.java:209)
    at ServerManage.stop(ServerManage.java:101)
    at SCTask.run(SCTask.java:47)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Error when logging in.
C:\Program Files (x86)\Steam\steamapps\common\Arma 3/instance_id11/BattlEye/BEServer.cfg
C:\Program Files (x86)\Steam\steamapps\common\Arma 3\instance_id11\BattlEye\BEServer.cfg
C:\Program Files (x86)\Steam\steamapps\common\Arma 3/instance_id11/BattlEye/BEServer.cfg
java.net.PortUnreachableException: ICMP Port Unreachable
    at java.net.DualStackPlainDatagramSocketImpl.socketReceiveOrPeekData(Native Method)
    at java.net.DualStackPlainDatagramSocketImpl.receive0(DualStackPlainDatagramSocketImpl.java:120)
    at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:144)
    at java.net.DatagramSocket.receive(DatagramSocket.java:812)
    at protocol.BEProtocol.receive(BEProtocol.java:150)
    at ServerManage.login(ServerManage.java:132)
    at ServerManage.isConnect(ServerManage.java:114)
    at ServerManage.isActive(ServerManage.java:204)
    at ServerManage.start(ServerManage.java:94)
    at SCTask.run(SCTask.java:50)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
Error when logging in.
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
command executed
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
command executed
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
command executed
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
command executed
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
login success
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
C:\Arma2\instance_id7\BattlEye\BEServer_active_5267.cfg
C:\Arma2/instance_id7/BattlEye/BEServer.cfg
Добавлено через 6 минут
В логе Эклипса смотрите строки 62, 78, 105 и 122
0
KEKCoGEN
Эксперт Java
2181 / 2033 / 526
Регистрация: 28.12.2010
Сообщений: 8,041
07.04.2016, 08:06 4
Цитата Сообщение от Algoritmer Посмотреть сообщение
try
* * * * * * * * * * {
* * * * * * * * * * * * ServerManage.stop(fid);
* * * * * * * * * * } catch(Exception e){}
Цитата Сообщение от Algoritmer Посмотреть сообщение
try
* * * * * * * * * * {
* * * * * * * * * * * * ServerManage.sCommand(fid, cmd);
* * * * * * * * * * }
* * * * * * * * * * catch(Exception e){}
за такое могут и пальцы переломать)


Исключение в этом коде не должно повлиять на следующий запуск таймера.
0
Algoritmer
155 / 95 / 24
Регистрация: 07.03.2013
Сообщений: 493
Записей в блоге: 1
07.04.2016, 14:08  [ТС] 5
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
за такое могут и пальцы переломать)
За что именно?

Добавлено через 1 минуту
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Исключение в этом коде не должно повлиять на следующий запуск таймера.
Но почему-то влияет
0
KEKCoGEN
Эксперт Java
2181 / 2033 / 526
Регистрация: 28.12.2010
Сообщений: 8,041
07.04.2016, 14:09 6
Algoritmer, за скрытие исключений. Когда у вас там падает исключение вы об этом никому не говорите. Нельзя так делать.

Добавлено через 25 секунд
Цитата Сообщение от Algoritmer Посмотреть сообщение
Но почему-то влияет
значит проблема не в этом фрагменте кода.
0
07.04.2016, 14:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2016, 14:09

Продолжение выполнения кода после отображения элемента
Форумчане, заранее прошу прощения за возможно глупый вопрос, но тем не менее: у менять компонент...

File Dialog продолжение работы после выбора файла
В ходе работы программы часто вызывается QFileDialog: configFilePath =...

Продолжение работы после того, как клиент закрыл страницу
Здравствуйте, хорошо знаю язык C#, и только начинаю осваивать asp.net. И возник один вопрос. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru