summaryrefslogtreecommitdiffstats
path: root/daemon/src/main/java/org/openslx/taskmanager/network
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/src/main/java/org/openslx/taskmanager/network')
-rw-r--r--daemon/src/main/java/org/openslx/taskmanager/network/NetworkHandler.java41
-rw-r--r--daemon/src/main/java/org/openslx/taskmanager/network/RequestParser.java20
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 {