/* * Copyright (c) 2008-2013 EMC Corporation * All Rights Reserved */ package com.emc.storageos.volumecontroller.impl.monitoring.cim.indicationProcessor; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.volumecontroller.impl.monitoring.cim.utility.CIMConstants; /** * Periodic timer that executes this class to process the indications sits in * the queue. * */ public class IntermediateProcessor implements Runnable { /** * Processor Interface */ private CIMIndicationProcessor _processor; /** * Logger to log the debug statements */ private static final Logger _logger = LoggerFactory .getLogger(IntermediateProcessor.class); /** * A reference to the list of indications */ private ConcurrentLinkedQueue<ArrivedIndication> _list; /** * A reference to DateFormatter */ private SimpleDateFormat format = new SimpleDateFormat( "EEE, d MMM yyyy HH:mm:ss"); /** * @param list */ public IntermediateProcessor(ConcurrentLinkedQueue<ArrivedIndication> list, CIMIndicationProcessor processor) { _list = list; _processor = processor; } @Override public void run() { if (_processor == null) { _logger.error("Unable to initialize the processors, Check Spring Configuration"); return; } int index = 0; _logger.debug("Timer awoke, iterating indications with size {}", _list.size()); for (ArrivedIndication indication : _list) { long duration = TimeUnit.MILLISECONDS.toMinutes(Calendar .getInstance().getTimeInMillis()) - TimeUnit.MILLISECONDS.toMinutes(indication .getArrivalTime()); _logger.debug( " {}. Arrival Time {} - Sit in Q for {} minute(s)", new Object[] { ++index, printArrivalTime(indication.getArrivalTime()), duration }); if (duration >= CIMConstants.INDICATION_PROCESS_INTERVAL) { _processor.processIndication(indication.getIndication()); _list.remove(indication); } } _logger.debug( "Indication processing cycle finished. {} indications left to process", _list.size()); } /** * Prints the long time in readable format * * @param arrivalTime * @return */ public synchronized String printArrivalTime(long arrivalTime) { Calendar time = Calendar.getInstance(); time.setTimeInMillis(arrivalTime); return format.format(time.getTime()); } }