package com.alipay.bluewhale.core.task.executer;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.apache.log4j.Logger;
import backtype.storm.utils.TimeCacheMap;
import com.alipay.bluewhale.core.stats.BaseTaskStatsRolling;
import com.alipay.bluewhale.core.task.transfer.TupleInfo;
import com.alipay.bluewhale.core.utils.TimeUtils;
/**
* ���ڴ���spout�е�tuple��ackerӦ��ʱ��Ĵ���
*
* @author yannian
*
* @param <K>
* @param <V>
*/
public class SpoutTimeCallBack<K, V> implements
TimeCacheMap.ExpiredCallback<K, V> {
private static Logger LOG = Logger.getLogger(SpoutTimeCallBack.class);
private ConcurrentLinkedQueue<Runnable> event_queue;
private backtype.storm.spout.ISpout spout;
private Map storm_conf;
private BaseTaskStatsRolling task_stats;
public SpoutTimeCallBack(ConcurrentLinkedQueue<Runnable> _event_queue,
backtype.storm.spout.ISpout _spout, Map _storm_conf,BaseTaskStatsRolling stat) {
this.event_queue = _event_queue;
this.spout = _spout;
this.storm_conf = _storm_conf;
this.task_stats=stat;
}
@Override
public void expire(K key, V val) {
if (val == null) {
return;
}
try {
List list = (List) val;
Object msgId = list.get(0);
Object tuple = list.get(1);
Long time_delta = 0l;
if (list.get(2) != null) {
Object start_time_ms = list.get(2);
if (start_time_ms != null) {
time_delta = TimeUtils.time_delta_ms((Long)start_time_ms);
}
}
if(tuple==null||msgId==null)
{
return;
}
event_queue.add(new FailSpoutMsg(spout, storm_conf, msgId,
(TupleInfo)tuple, time_delta, task_stats));
} catch (Exception e) {
LOG.error("expire error", e);
}
}
}