/**
*
*/
package hk.hku.cecid.edi.sfrm.task;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import hk.hku.cecid.edi.sfrm.handler.MessageStatusQueryHandler;
import hk.hku.cecid.edi.sfrm.spa.SFRMLog;
import hk.hku.cecid.edi.sfrm.spa.SFRMProcessor;
import hk.hku.cecid.edi.sfrm.util.StatusQuery;
import hk.hku.cecid.piazza.commons.module.ActiveTaskModule;
import hk.hku.cecid.piazza.commons.module.LimitedActiveTaskList;
/**
* @author Patrick Yip
* Collector to query the status of active message periodically. The status of message includes
* <ul>
* <li>status code</li>
* <li>status description</li>
* <li>number of processed segment</li>
* <li>message speed (KB/s)</li>
* </ul>
*/
public class MessageStatusCollector extends LimitedActiveTaskList {
private long currentExecutionInterval;
private ActiveTaskModule segmentCollector;
private boolean initialized = false;
private void initialize(){
segmentCollector = (ActiveTaskModule) SFRMProcessor.getInstance().getModuleGroup().getModule("sfrm.outgoing.segment.collector");
currentExecutionInterval = Long.parseLong(segmentCollector.getParameters().getProperty("execution-interval"));
}
/* (non-Javadoc)
* @see hk.hku.cecid.piazza.commons.module.ActiveTaskList#getTaskList()
*/
@Override
public List getTaskList() {
if(!initialized){
initialize();
initialized = true;
}
MessageStatusQueryHandler statusHandler = SFRMProcessor.getInstance().getMessageSpeedQueryHandler();
Iterator<String> statusIter = statusHandler.getMessageList();
double totalSpeed = 0.0;
long maxSegmentSize = 0;
int count = 0;
while(statusIter.hasNext()){
String msgId = statusIter.next();
StatusQuery query = (StatusQuery) statusHandler.getMessageSpeedQuery(msgId);
try {
query.tick();
totalSpeed += query.getCurrentSpeed();
if(query.getSegmentSize() > maxSegmentSize)
maxSegmentSize = query.getSegmentSize();
} catch (Exception e) {
SFRMProcessor.getInstance().getLogger().error(SFRMLog.MSC_CALLER + "Failure on marking the message status", e);
}
count++;
}
return new ArrayList();
}
}