package main.java.spouts; import static main.java.utils.constants.WorkberchConstants.INDEX_FIELD; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import main.java.utils.redis.RedisHandeler; import backtype.storm.spout.SpoutOutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseRichSpout; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Values; abstract public class WorkberchGenericSpout extends BaseRichSpout { private static final long serialVersionUID = 1L; private final List<String> spoutFields; private String boltId; private boolean init = true; private long indexSpout = 0L; protected SpoutOutputCollector collector; public WorkberchGenericSpout(final List<String> fields) { fields.add(INDEX_FIELD); spoutFields = fields; } public List<String> getInputPorts() { return new ArrayList<String>(); } public List<String> getOutputPorts() { return spoutFields; } @Override @SuppressWarnings("rawtypes") public void open(final Map conf, final TopologyContext context, final SpoutOutputCollector collector) { this.collector = collector; boltId = context.getThisComponentId(); } @Override public void nextTuple() { if (init) { final Iterator<Values> iterValues = getValues().iterator(); while (iterValues.hasNext()) { RedisHandeler.increseEmitedState(boltId); final Values value = iterValues.next(); value.add(indexSpout++); if (!iterValues.hasNext()) { RedisHandeler.setStateFinished(boltId); } emitNextTuple(value); } } init = false; } @Override public void declareOutputFields(final OutputFieldsDeclarer declarer) { declarer.declare(new Fields(spoutFields)); } abstract public List<Values> getValues(); abstract public void emitNextTuple(final Values values); }