/**
* This file is part of Path Computation Element Emulator (PCEE).
*
* PCEE is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PCEE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PCEE. If not, see <http://www.gnu.org/licenses/>.
*/
package com.pcee.architecture.computationmodule.threadpool;
import java.util.concurrent.LinkedBlockingQueue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.graph.graphcontroller.Gcontroller;
import com.pcee.architecture.ModuleManagement;
import com.pcee.architecture.computationmodule.ted.TopologyInformation;
import com.pcee.protocol.message.PCEPMessage;
public class Worker extends Thread {
private Logger logger;
private String ID;
private LinkedBlockingQueue<PCEPMessage> requestQueue;
private ThreadPool pool;
private ModuleManagement lm;
private boolean terminateWorker = false;
/**Function to set the flag to terminate the worker thread
*
* @param value
*/
public void setTerminate(boolean value){
this.terminateWorker=value;
}
/**Default Constructor
*
* @param layerManagement
* @param pool
* @param ID
* @param requestQueue
* @param graph
*/
public Worker(ModuleManagement layerManagement, ThreadPool pool, String ID, LinkedBlockingQueue<PCEPMessage> requestQueue, Gcontroller graph){
lm = layerManagement;
this.pool = pool;
this.ID = ID;
this.requestQueue = requestQueue;
logger = LoggerFactory.getLogger("Worker-" + ID);
}
/**Main run method of the worker thread */
public void run(){
logger.info("Initializing Worker Thread ID = " + ID);
PCEPMessage request = null;
int flag=0;
while(!terminateWorker){
WorkerTask task = null;
try {
if (flag==0){
request = requestQueue.take();
//Record the leaving Queue Time for each request
// logger.info("Starting request ID " + request.getRequestID());
logger.info("Current Length of Request Queue = " + requestQueue.size());
}
} catch (InterruptedException e) {
if (terminateWorker){
logger.debug("Stopping Worker Thread : " + ID);
break;
}
continue;
}
//Flag to check if thread was interrupted during a wait operation or during a computation
flag=1;
if (request!=null){
task = new WorkerTask(lm, request, TopologyInformation.getInstance().getGraph().createCopy());
task.run();
// logger.info("Completed processing of request ID " + request.getRequestID());
}
if (Thread.currentThread().isInterrupted()) {
if (terminateWorker){
logger.debug("Stopping Worker Thread : " + ID);
break;
}
continue;
}
//The request was computed successfully, and the flag variable is set to indicate
//that a new request be processed in the next iteration
flag=0;
}
}
}