diff options
Diffstat (limited to 'daemon/src/main/java/org/openslx/taskmanager/network')
-rw-r--r-- | daemon/src/main/java/org/openslx/taskmanager/network/NetworkHandler.java | 41 | ||||
-rw-r--r-- | daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java | 20 |
2 files changed, 29 insertions, 32 deletions
diff --git a/daemon/src/main/java/org/openslx/taskmanager/network/NetworkHandler.java b/daemon/src/main/java/org/openslx/taskmanager/network/NetworkHandler.java index 3e2c8fd..5d98512 100644 --- a/daemon/src/main/java/org/openslx/taskmanager/network/NetworkHandler.java +++ b/daemon/src/main/java/org/openslx/taskmanager/network/NetworkHandler.java @@ -3,6 +3,7 @@ package org.openslx.taskmanager.network; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; +import java.net.InetAddress; import java.net.SocketAddress; import java.net.SocketException; import java.nio.charset.StandardCharsets; @@ -23,46 +24,33 @@ public class NetworkHandler implements Runnable // Static part - private static Thread recvThread = null; - private static Thread sendThread = null; + private Thread sendThread = null; /** * Sender instance (Runnable handling outgoing packets) */ - private static Sender sender = null; + private final Sender sender; /** * UDP socket for sending and receiving. */ - private static DatagramSocket socket; + private final DatagramSocket socket; + + private final RequestParser parser; /** * Initialize the NetworkHandler by starting threads and opening the socket. */ - public static void init() throws SocketException + public NetworkHandler( int port, InetAddress listenAddress, RequestParser parser ) throws SocketException { - if ( recvThread != null ) - throw new RuntimeException( "Already initialized" ); - socket = new DatagramSocket( Global.LISTEN_PORT, Global.LISTEN_ADDRESS ); - recvThread = new Thread( new NetworkHandler() ); - recvThread.start(); + socket = new DatagramSocket( port, listenAddress ); sendThread = new Thread( sender = new Sender() ); - sendThread.start(); + this.parser = parser; } - public static void shutdown() + public void shutdown() { socket.close(); } - public static void join() - { - try { - recvThread.join(); - sendThread.join(); - } catch ( InterruptedException e ) { - Thread.currentThread().interrupt(); - } - } - // Class part /** @@ -97,6 +85,7 @@ public class NetworkHandler implements Runnable { byte readBuffer[] = new byte[ 66000 ]; try { + sendThread.start(); while ( !Global.doShutdown ) { DatagramPacket packet = new DatagramPacket( readBuffer, readBuffer.length ); try { @@ -112,11 +101,12 @@ public class NetworkHandler implements Runnable } String payload = new String( readBuffer, 0, packet.getLength(), StandardCharsets.UTF_8 ); try { - byte[] reply = RequestParser.handle( payload ); + byte[] reply = parser.handle( payload ); if ( reply != null ) send( packet.getSocketAddress(), reply ); } catch ( Throwable t ) { - log.error( "Exception in RequestParser: " + t.getMessage() ); + log.error( "Exception in RequestParser: " + t.toString() ); + log.error( "Payload was: " + payload ); t.printStackTrace(); } } @@ -124,6 +114,7 @@ public class NetworkHandler implements Runnable Thread.currentThread().interrupt(); } finally { Global.doShutdown = true; + sendThread.interrupt(); log.info( "UDP receiver finished." ); } } @@ -132,7 +123,7 @@ public class NetworkHandler implements Runnable * Private sending thread. * Use blocking queue, wait for packet to be added to it, then try to send. */ - static class Sender implements Runnable + private class Sender implements Runnable { /** diff --git a/daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java b/daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java index d2cfb21..5741e58 100644 --- a/daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java +++ b/daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java @@ -15,15 +15,21 @@ public class RequestParser /** * Our very own gson instance (for serializing replies) */ - private static final Gson sendGson = new Gson(); + private final Gson sendGson = new Gson(); + + private final Taskmanager taskManager; + + public RequestParser( Taskmanager tm ) + { + this.taskManager = tm; + } /** * Handle the given unparsed request. * - * @param source source of the request, where the reply will be send to (if any) * @param payload Packet data received from network, already converted to a string */ - public static byte[] handle( String payload ) + public byte[] handle( String payload ) { String[] parts = payload.split( " *, *", 3 ); // Message format is "<message id>, <command>, <command payload/argument>" @@ -34,21 +40,21 @@ public class RequestParser // Look at parts[1], if it's "status" it's a request for the task // with the ID given in parts[2] if ( parts[1].equals( "status" ) ) { - TaskStatus status = Taskmanager.getTaskStatus( parts[2] ); + TaskStatus status = taskManager.getTaskStatus( parts[2] ); return serialize( parts[0], status ); } // Now check if parts[1] is "release" if ( parts[1].equals( "release" ) ) { - Taskmanager.releaseTask( parts[2] ); + taskManager.releaseTask( parts[2] ); return null; } // Anything else in parts[0] will be treated as a fresh task invocation, so let's // pass it on to the task manager. - TaskStatus status = Taskmanager.submitTask( parts[1], parts[2] ); + TaskStatus status = taskManager.submitTask( parts[1], parts[2] ); return serialize( parts[0], status ); } - private static byte[] serialize( String messageId, TaskStatus status ) + private byte[] serialize( String messageId, TaskStatus status ) { String data; try { |