package org.act.tstream.task.execute.spout;
import java.util.Map;
import org.apache.log4j.Logger;
import backtype.storm.task.TopologyContext;
import backtype.storm.utils.DisruptorQueue;
import backtype.storm.utils.WorkerClassLoader;
import org.act.tstream.metric.MetricDef;
import org.act.tstream.metric.Metrics;
import org.act.tstream.stats.CommonStatsRolling;
import org.act.tstream.task.TaskStatus;
import org.act.tstream.task.TaskTransfer;
import org.act.tstream.task.acker.Acker;
import org.act.tstream.task.comm.TaskSendTargets;
import org.act.tstream.task.comm.TupleInfo;
import org.act.tstream.task.error.ITaskReportErr;
import org.act.tstream.utils.RotatingMap;
import com.codahale.metrics.Gauge;
/**
* spout executor
*
* All spout actions will be done here
*
* @author yannian/Longda
*
*/
public class SingleThreadSpoutExecutors extends SpoutExecutors {
private static Logger LOG = Logger
.getLogger(SingleThreadSpoutExecutors.class);
public SingleThreadSpoutExecutors(backtype.storm.spout.ISpout _spout,
TaskTransfer _transfer_fn,
Map<Integer, DisruptorQueue> innerTaskTransfer, Map _storm_conf,
DisruptorQueue deserializeQueue, TaskSendTargets sendTargets,
TaskStatus taskStatus, TopologyContext topology_context,
TopologyContext _user_context, CommonStatsRolling _task_stats,
ITaskReportErr _report_error) {
super(_spout, _transfer_fn, innerTaskTransfer, _storm_conf,
deserializeQueue, sendTargets, taskStatus, topology_context,
_user_context, _task_stats, _report_error);
// sending Tuple's TimeCacheMap
pending = new RotatingMap<Long, TupleInfo>(Acker.TIMEOUT_BUCKET_NUM, null, true);
Metrics.register(idStr, MetricDef.PENDING_MAP, new Gauge<Integer>() {
@Override
public Integer getValue() {
return pending.size();
}
}, String.valueOf(taskId), Metrics.MetricType.TASK);
super.prepare(sendTargets, _transfer_fn, topology_context);
}
@Override
public String getThreadName() {
return idStr + "-" +SingleThreadSpoutExecutors.class.getSimpleName();
}
@Override
public void run() {
WorkerClassLoader.switchThreadContext();
try {
executeEvent();
super.nextTuple();
} finally {
WorkerClassLoader.restoreThreadContext();
}
}
private void executeEvent() {
try {
exeQueue.consumeBatch(this);
} catch (Exception e) {
if (taskStatus.isShutdown() == false) {
LOG.error("Actor occur unknow exception ", e);
}
}
}
}