/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package bftsmart.tom.core;
import bftsmart.communication.ServerCommunicationSystem;
import bftsmart.communication.SystemMessage;
import bftsmart.tom.core.messages.TOMMessage;
import java.util.LinkedList;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
/**
*
* @author snake
*/
public class ReplyManager {
private LinkedList<ReplyThread> threads;
private int iteration;
public ReplyManager(int numThreads, ServerCommunicationSystem cs) {
this.threads = new LinkedList();
this.iteration = 0;
for (int i = 0; i < numThreads; i++) {
this.threads.add(new ReplyThread(cs));
}
for (ReplyThread t : threads)
t.start();
}
public void send (TOMMessage msg) {
iteration++;
threads.get((iteration % threads.size())).send(msg);
}
}
class ReplyThread extends Thread {
private static final long POOL_TIME = 5000;
private LinkedBlockingQueue<TOMMessage> replies;
private ServerCommunicationSystem cs = null;
ReplyThread(ServerCommunicationSystem cs) {
this.cs = cs;
this.replies = new LinkedBlockingQueue<TOMMessage>();
}
void send(TOMMessage msg) {
replies.add(msg);
}
public void run() {
TOMMessage msg;
while (true) {
try {
msg = replies.poll(POOL_TIME, TimeUnit.MILLISECONDS);
if (msg == null) {
continue; //go back to the start of the loop
}
cs.getClientsConn().send(new int[] {msg.getSender()}, msg.reply, false);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}