Added new way of handling issues

This commit is contained in:
2026-06-15 17:57:31 +02:00
parent aa016d4772
commit 62e1096ef9
10 changed files with 199 additions and 27 deletions
@@ -9,6 +9,8 @@ import java.net.NoRouteToHostException;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.ObservableList;
import kst4contest.locatorUtils.Location;
@@ -17,6 +19,7 @@ import kst4contest.model.ChatMember;
public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
private static final Logger LOGGER = Logger.getLogger(AirScoutPeriodicalAPReflectionInquirerTask.class.getName());
private ChatController client;
public AirScoutPeriodicalAPReflectionInquirerTask(ChatController client) {
@@ -55,7 +58,7 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
ownCallSign = this.client.getChatPreferences().getStn_loginCallSign();
}
} catch (Exception e) {
System.out.println("[ASPERIODICAL, Error]: " + e.getMessage());
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] Error parsing callsign", e);
}
String myCallAndMyLocString = ownCallSign + "," + this.client.getChatPreferences().getStn_loginLocatorMainCat(); //bugfix, Airscout do not process 9A1W-2 but 9A1W like formatted calls
@@ -105,13 +108,13 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
dsocket.send(packet);
dsocket.close();
} catch (UnknownHostException e1) {
e1.printStackTrace();
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] Unknown host", e1);
} catch (NoRouteToHostException e) {
e.printStackTrace();
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] No route to host", e);
} catch (SocketException e) {
e.printStackTrace();
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] Socket error", e);
} catch (IOException e) {
e.printStackTrace();
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] IO error sending query", e);
}
// System.out.println("[ASUDPTask, info:] sent query " + queryStringToAirScout);
@@ -136,9 +139,9 @@ public class AirScoutPeriodicalAPReflectionInquirerTask extends TimerTask {
dsocket.send(packet);
dsocket.close();
} catch (IOException e) {
e.printStackTrace();
LOGGER.log(Level.SEVERE, "[ASPERIODICAL] IO error sending watchlist", e);
}
// System.out.println("[ASUDPTask, info:] set watchlist: " + asWatchListStringSuffix);
@@ -10,9 +10,12 @@ import java.net.Socket;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
public class DXClusterThreadPooledServer implements Runnable{
private static final Logger LOGGER = Logger.getLogger(DXClusterThreadPooledServer.class.getName());
private List<Socket> clientSockets = Collections.synchronizedList(new ArrayList<>()); //list of all connected clients
private ThreadStatusCallback callBackToController;
@@ -111,8 +114,7 @@ public class DXClusterThreadPooledServer implements Runnable{
System.out.println("-------------> ORIGINALEE VAL: " + aChatMember.getFrequency().getValue());
System.out.println("-------------> NORMALIZED VAL: " + Utils4KST.normalizeFrequencyString(aChatMember.getFrequency().getValue(), chatController.getChatPreferences().getNotify_optionalFrequencyPrefix()) + " ");
} catch (Exception e) {
System.out.println("DXCThPooledServer: Error accessing value in chatmember object: " + e.getMessage());
// e.printStackTrace();
LOGGER.log(Level.SEVERE, "DXCThPooledServer: Error accessing value in chatmember object", e);
}
for (Socket socket : clientSockets) {
@@ -146,8 +148,7 @@ public class DXClusterThreadPooledServer implements Runnable{
callBackToController.onThreadStatus(ThreadNickName,threadStateMessage);
} catch (IOException e) {
e.printStackTrace();
System.out.println("[DXClusterSrvr, Error:] broadcasting DXC-message to clients went wrong!");
LOGGER.log(Level.SEVERE, "[DXClusterSrvr] broadcasting DXC-message to clients went wrong", e);
return false;
}
}
@@ -159,6 +160,7 @@ public class DXClusterThreadPooledServer implements Runnable{
class DXClusterServerWorkerRunnable implements Runnable{
private static final Logger LOGGER = Logger.getLogger(DXClusterServerWorkerRunnable.class.getName());
protected Socket clientSocket = null;
protected String serverText = null;
private ChatController client = null;
@@ -197,14 +199,13 @@ class DXClusterServerWorkerRunnable implements Runnable{
output.write(("\r\n").getBytes());
} catch (IOException e) {
e.printStackTrace();
System.out.println("[DXClusterSrvr, Error:] broadcasting DXC-message to clients went wrong!");
LOGGER.log(Level.SEVERE, "[DXClusterSrvr] keep-alive broadcast to client failed", e);
dXCkeepAliveTimer.purge();
try {
socket.close();
} catch (IOException ex) {
ex.printStackTrace();
LOGGER.log(Level.SEVERE, "[DXClusterSrvr] error closing client socket", ex);
}
finally {
this.cancel();
@@ -224,7 +225,7 @@ class DXClusterServerWorkerRunnable implements Runnable{
System.out.println("[DXClusterThreadPooledServer, Info:] New cluster client connected! "); //TODO: maybe integrate non blocking reader for client identification
} catch (IOException e) {
e.printStackTrace();
LOGGER.log(Level.SEVERE, "[DXClusterSrvr] error in worker runnable", e);
} finally {
synchronized(dxClusterClientSocketsConnectedList) {
dxClusterClientSocketsConnectedList.remove(clientSocket); // Entferne den Client nach Verarbeitung
@@ -2,6 +2,8 @@ package kst4contest.controller;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import kst4contest.model.ChatMessage;
@@ -13,6 +15,7 @@ import kst4contest.model.ChatMessage;
* No need for it as it´s not longer a console application
*/
public class InputReaderThread extends Thread {
private static final Logger LOGGER = Logger.getLogger(InputReaderThread.class.getName());
private PrintWriter writer;
private Socket socket;
private ChatController client;
@@ -39,8 +42,7 @@ public class InputReaderThread extends Thread {
try {
sendThisMessage23001 = reader.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
LOGGER.log(Level.SEVERE, "Error reading from stdin", e);
}
ownMSG.setMessageText("MSG|" + this.client.getChatCategoryMain().getCategoryNumber() + "|0|" + sendThisMessage23001 + "|0|");
@@ -53,8 +55,8 @@ public class InputReaderThread extends Thread {
try {
this.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
LOGGER.log(Level.SEVERE, "InputReaderThread interrupted", e);
Thread.currentThread().interrupt();
}
}
@@ -3,6 +3,8 @@ package kst4contest.controller;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.logging.Level;
import java.util.logging.Logger;
import kst4contest.model.ChatMessage;
@@ -14,6 +16,7 @@ import kst4contest.model.ChatMessage;
* @author www.codejava.net
*/
public class ReadThread extends Thread {
private static final Logger LOGGER = Logger.getLogger(ReadThread.class.getName());
private BufferedReader reader;
private Socket socket;
private ChatController client;
@@ -43,8 +46,7 @@ public class ReadThread extends Thread {
reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
} catch (IOException ex) {
System.out.println("Error getting input stream: " + ex.getMessage());
ex.printStackTrace();
LOGGER.log(Level.SEVERE, "Error getting input stream", ex);
}
}
@@ -82,15 +84,14 @@ public class ReadThread extends Thread {
}
catch (Exception sexc) {
System.out.println("[ReadThread, CRITICAL: ] Socket geschlossen: " + sexc.getMessage());
LOGGER.log(Level.SEVERE, "[ReadThread] Socket closed unexpectedly", sexc);
try {
this.client.getSocket().close();
this.interrupt();
break;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
LOGGER.log(Level.SEVERE, "[ReadThread] Error closing socket", e);
}
}
@@ -7,12 +7,16 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* This class has utility methods to handle application files inside the home directory.
*/
public class ApplicationFileUtils {
private static final Logger LOGGER = Logger.getLogger(ApplicationFileUtils.class.getName());
/**
* Gets the path of a file inside the home directory of the user.
* @param applicationName Name off the application which is used for the hidden directory
@@ -61,8 +65,7 @@ public class ApplicationFileUtils {
resourceStream.transferTo(fileOutputStream);
} catch (IOException ex) {
System.err.println("Exception when copying Application file: " + ex.getMessage());
ex.printStackTrace(System.err);
LOGGER.log(Level.SEVERE, "Exception when copying Application file: " + ex.getMessage(), ex);
}
}
@@ -3,7 +3,12 @@ package kst4contest.view;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.util.*;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.function.Consumer;
import java.util.function.Predicate;
@@ -8504,9 +8509,24 @@ public class Kst4ContestApplication extends Application implements StatusUpdateL
public static void main(String[] args) {
setupFileLogging();
launch(args);
}
private static void setupFileLogging() {
try {
String logDir = Path.of(System.getProperty("user.home"), ".praktiKST").toString();
new File(logDir).mkdirs();
FileHandler fileHandler = new FileHandler(logDir + "/kst4contest-errors.log", true);
fileHandler.setLevel(Level.SEVERE);
fileHandler.setFormatter(new SimpleFormatter());
Logger rootLogger = Logger.getLogger("");
rootLogger.addHandler(fileHandler);
} catch (IOException e) {
System.err.println("Could not set up file logging: " + e.getMessage());
}
}
@Override
public void onThreadStatusChanged(String key, ThreadStateMessage threadStateMessage) {
+1
View File
@@ -5,6 +5,7 @@ module praktiKST {
requires jdk.xml.dom;
requires java.sql;
requires javafx.media;
requires java.logging;
exports kst4contest.controller.interfaces;
exports kst4contest.controller;
exports kst4contest.locatorUtils;