uprava ping probe

pull/1/head
Michal 2025-02-13 18:28:03 +01:00
parent 8276df1596
commit 839231901f
3 changed files with 36 additions and 24 deletions

View File

@ -6,8 +6,9 @@ mysql_password=Michal2407
mysql_database=jnet mysql_database=jnet
server_port=1225 server_port=1225
debug=true debug=true
ping_attempt=2 ping_attempt=4
ping_timeout=2000 ping_timeout=2
ping_repeat=3
instability_attempt=2 instability_attempt=2
instability_limit=1000 instability_limit=1

View File

@ -11,7 +11,6 @@ import jnet.lib.Status;
import jnet.lib.object.MapObject; import jnet.lib.object.MapObject;
import jnet.server.Server; import jnet.server.Server;
public class NettyPing extends Thread { public class NettyPing extends Thread {
private static final HashedWheelTimer TIMER = new HashedWheelTimer(); // Netty časovač private static final HashedWheelTimer TIMER = new HashedWheelTimer(); // Netty časovač
@ -19,10 +18,8 @@ public class NettyPing extends Thread {
public NettyPing() { public NettyPing() {
} }
@Override @Override
public void start() { public void run() {
LogFile.printInfo("Ping probe start"); LogFile.printInfo("Ping probe start");
for (MapObject mapObject : Server.mapObject) { for (MapObject mapObject : Server.mapObject) {
schedulePing(mapObject); schedulePing(mapObject);
@ -34,7 +31,7 @@ public class NettyPing extends Thread {
@Override @Override
public void run(Timeout timeout) { public void run(Timeout timeout) {
pingHost(object); pingHost(object);
timeout.timer().newTimeout(this, 3, TimeUnit.SECONDS); // Opakuje každých 5 sekund timeout.timer().newTimeout(this, Server.config.getInt("ping_repeat"), TimeUnit.SECONDS); // Opakuje každých x sekund
} }
}, 0, TimeUnit.SECONDS); }, 0, TimeUnit.SECONDS);
} }
@ -42,8 +39,8 @@ public class NettyPing extends Thread {
private static void pingHost(MapObject object) { private static void pingHost(MapObject object) {
try { try {
String command = System.getProperty("os.name").startsWith("Windows") String command = System.getProperty("os.name").startsWith("Windows")
? "ping -n 1 " + object.getIp() ? "ping -n 1 -w " + String.valueOf((Server.config.getInt("ping_timeout")*1000)) + " " + object.getIp() // Timeout 2000 ms (Windows)
: "ping -c 1 " + object.getIp(); : "ping -c 1 -W " + String.valueOf(Server.config.getInt("ping_timeout")) + " " + object.getIp(); // Timeout 2 sec (Linux)
Process process = Runtime.getRuntime().exec(command); Process process = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
@ -60,16 +57,18 @@ public class NettyPing extends Thread {
} }
//System.out.println("Ping na " + object.getIp() + (success ? " uspesny! RTT: " + timeMs + " ms" : " selhal!")); //System.out.println("Ping na " + object.getIp() + (success ? " uspesny! RTT: " + timeMs + " ms" : " selhal!"));
if (success) {
if (object.getStatus() != Status.OK) { if (object.getStatus() != Status.OK) {
PingResult.stateOnline(object); PingResult.stateOnline(object);
} }
} else {
PingResult.stateOffline(object);
}
process.waitFor(); process.waitFor();
} catch (Exception e) { } catch (Exception e) {
System.err.println("Chyba pri pingu na " + object.getIp());
PingResult.stateOffline(object); PingResult.stateOffline(object);
//e.printStackTrace(); LogFile.printErr("Chyba pri pingu na " + object.getIp() + " " + e.getMessage());
} }
} }
@ -83,5 +82,4 @@ public class NettyPing extends Thread {
return -1; return -1;
} }
} }

View File

@ -10,14 +10,26 @@ import jnet.server.ServerMessageParser;
public class PingResult { public class PingResult {
private static final int POKUS = 2; private static final int POKUS = Server.config.getInt("ping_attempt");
public static void stateOnline(MapObject obj) { public static void stateOnline(MapObject obj) {
// oveří jestli neni zarizeni vypnuto // oveří jestli neni zarizeni vypnuto
if (obj.isActive()) { if (obj.isActive() && obj.getStatus() != Status.OK) {
// vynuluje ping pokusy // vynuluje ping pokusy
obj.setPingAttemp(0); obj.setPingAttemp(0);
// pokud byl předchozí stav offline ukončí event
if (obj.getStatus() == Status.OFFLINE) {
// aktualizace eventu
Event event = Database.endEvent(obj.getId(), Event.TYPE_PING);
for (int i = 0; i < Server.events.size(); i++) {
if (Server.events.get(i).getId() == event.getId()) {
Server.events.set(i, event);
}
}
// odeslani aktualizovaného eventu
ServerMessageParser.sendAll(Message.EVENT_UPDATE, event);
}
// nastavi status objektu // nastavi status objektu
obj.setStatus(Status.OK); obj.setStatus(Status.OK);
// odesle informaci o novem stavu klientum // odesle informaci o novem stavu klientum
@ -28,7 +40,8 @@ public class PingResult {
public static void stateOffline(MapObject obj) { public static void stateOffline(MapObject obj) {
// oveří jestli neni zarizeni vypnuto // oveří jestli neni zarizeni vypnuto
if (obj.isActive()) { if (obj.isActive()) {
if (obj.getPingAttemp() >= POKUS) { if (obj.getPingAttemp() >= POKUS && obj.getStatus() != Status.OFFLINE) {
System.err.println("objekt: " + obj.getName() + " pokus: " + obj.getPingAttemp());
// nastavi status objektu // nastavi status objektu
obj.setStatus(Status.OFFLINE); obj.setStatus(Status.OFFLINE);
// odesle informaci o novem stavu klientum // odesle informaci o novem stavu klientum