Hi,
hab folgendes Problem: ich habe eine Engine, die regelmäßig isAlive versenden soll (hab ich mit TimerTask gemacht), dazu hätte ich gerne einen zweiten Thread der Eingaben wie zb. exit (also über die Konsole) verarbeiten kann.
Das versenden der isAlive Messages erfolgt leider erst nachdem ich irgendwas in die Kosole getippt und bestätigt habe...
Hier mal mein Code:
meine main:
und zu guter letzt der thread für die user-eingaben
Sehe meinen Fehler leider selber nicht ;(.
Bitte um Eure Hilfe - Danke!!
hab folgendes Problem: ich habe eine Engine, die regelmäßig isAlive versenden soll (hab ich mit TimerTask gemacht), dazu hätte ich gerne einen zweiten Thread der Eingaben wie zb. exit (also über die Konsole) verarbeiten kann.
Das versenden der isAlive Messages erfolgt leider erst nachdem ich irgendwas in die Kosole getippt und bestätigt habe...
Hier mal mein Code:
Java:
public class SendAlivePacket extends TimerTask{
private DatagramSocket socket;
@Override
public void run() {
// get a datagram socket
//DatagramSocket socket = null;
try {
socket = new DatagramSocket();
} catch (SocketException e) {
System.out.println("Es konnte kein DatagramSocket erstellt werden!");
System.exit(1);
//e.printStackTrace();
}
byte[] buf = new byte[128];
//Wenn der boolean true ist, dann ist die Engine nicht suspended und soll isAlive pakete schicken!
if (isActivated == true){
String messageForScheduler = String.valueOf(tcpPort)+" "+String.valueOf(maxConsumption)+
" "+String.valueOf(minConsumption)+" "+String.valueOf(load);
//System.out.println(messageForScheduler);
buf = messageForScheduler.getBytes();
InetAddress address = null;
try {
address = InetAddress.getByName(schedulerHost);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, schedulerUDPPort);
try {
socket.send(packet);
// System.out.println("isAlive packet gesendet!");
//socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
meine main:
Java:
public static void main(String[] args) {
// TODO Auto-generated method stub
ServerSocket serverSocket = null;
checkingAndSettingArguments(args);
isActivated = true;
pool = Executors.newCachedThreadPool();
try {
serverSocket = new ServerSocket(tcpPort);
System.out.println("Connection to port: "+tcpPort);
} catch (IOException e) {
System.err.println("Could not listen on port: "+tcpPort+".");
System.exit(-1);
}
//Hier wird der Timer gestartet, der in regelmaessigen Abstaenden isAlive
//Pakete an den Scheduler sendet.
Timer timer1 = new Timer();
timer1.schedule(new GenericTaskEngine().new SendAlivePacket(), alivePeriod, alivePeriod);
//Thread fuer interactiveCommand
pool.execute(new GenericTaskEngineInteractiveCommandThread());
//Solange der interactive Commannd laeuft, koennen Client-Anfragen bearbietet werden.
while(isActivated){
try {
pool.execute(new MultiEngineThread(serverSocket.accept()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
und zu guter letzt der thread für die user-eingaben
Java:
public class GenericTaskEngineInteractiveCommandThread
extends Thread{
private BufferedReader in = new BufferedReader(
new InputStreamReader(System.in));
private boolean listening = true;
/**
* @return the listening
*/
public boolean isListening() {
return listening;
}
@Override
public void run() {
while(listening == true){
System.out.println("Engine ready for interacitve commands!");
String userEntry;
try {
while((userEntry = in.readLine())!= null){
System.out.println("User entered: "+userEntry);
this.processInteractiveCommand(userEntry);
userEntry = null;
}
} catch (IOException e) {
System.out.println("Could not read interactive command!");
listening = false;
e.printStackTrace();
}
}
try {
in.close();
System.out.println("Interactive command thread closed!");
} catch (IOException e) {
System.out.println("Could not close interactive command thread!");
e.printStackTrace();
}
}
/**
* Diese Methode verarbeitet die interaktiven Usereingaben.
* Moeglich sind !engines, !companies, !exit.
* @param userEntry
*/
private void processInteractiveCommand(String userEntry){
System.out.println("Your entry: "+userEntry);
if(userEntry.toUpperCase().trim().equals("!EXIT")){
listening = false;
}else if(userEntry.toUpperCase().trim().equals("!LOAD")){
System.out.println("Current load: "+GenericTaskEngine.getLoad()+"%");
}else{
System.out.println("Unknown command!");
}
}
}
Sehe meinen Fehler leider selber nicht ;(.
Bitte um Eure Hilfe - Danke!!