package org.t4f.bsc.thread;
import java.util.HashMap;
import java.util.logging.Logger;
import org.t4f.bsc.pocsag.PocsagMessage;
import org.t4f.bsc.pocsag.PocsagQueue;
import org.t4f.bsc.pocsag.bts.BTSController;
public class PocsagProcess extends Thread {
private final static Logger LOGGER = Logger.getLogger("POCSAG-BSC");
private volatile boolean running = true;
public PocsagProcess() {
super("PocsagProcess");
}
@Override
public void run() {
HashMap <PocsagMessage, Integer> numTimesProccesed = new HashMap<PocsagMessage, Integer>();
while (running) {
//try {
PocsagMessage pocsagMessage = PocsagQueue.pollMessageQueue();
if (pocsagMessage == null) {
// Timeout.
// Generates a idle message
//
// Esta logica habria que ver si meterla en el MSC o donde, por que hay que saber en que
// frecuencias operan nuestros subscribers y generar idles para todas ellas.
} else {
if (processPocsagMessage(pocsagMessage)) {
// The message couldnt be proccesed.
int numRetries = (numTimesProccesed.get(pocsagMessage)==null)?0:numTimesProccesed.get(pocsagMessage);
if (numRetries<5) {
// Send it back to queue to try again after waiting 10 seconds
numTimesProccesed.put(pocsagMessage, ++numRetries);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LOGGER.fine("Retrying (" + numRetries + ") message: " + pocsagMessage);
PocsagQueue.enqueuePocsagMessage(pocsagMessage);
} else {
numTimesProccesed.remove(pocsagMessage);
LOGGER.fine("Dismissing message after " + numRetries + " tries: " + pocsagMessage);
}
}
}
// } catch (InterruptedException e) {
// shutdown();
// }
}
}
public void shutdown() {
running = false;
LOGGER.fine("Stopping PocsagProcessor thread");
}
private boolean processPocsagMessage(PocsagMessage pocsagMessage) {
LOGGER.fine("Processing POCSAG message: " + pocsagMessage);
BTSController btsController = new BTSController();
return btsController.sendPocsagMessage(pocsagMessage);
}
}