package storm.applications.spout; 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.utils.Utils; import java.util.HashMap; import java.util.Map; import storm.applications.constants.BaseConstants; import storm.applications.constants.BaseConstants.BaseStream; import storm.applications.hooks.SpoutMeterHook; import storm.applications.util.config.Configuration; import static storm.applications.util.config.Configuration.METRICS_ENABLED; /** * * @author Maycon Viana Bordin <mayconbordin@gmail.com> */ public abstract class AbstractSpout extends BaseRichSpout { protected String configPrefix = BaseConstants.BASE_PREFIX; protected Configuration config; protected SpoutOutputCollector collector; protected TopologyContext context; protected Map<String, Fields> fields; public AbstractSpout() { fields = new HashMap<>(); } public void setFields(Fields fields) { this.fields.put(BaseStream.DEFAULT, fields); } public void setFields(String streamId, Fields fields) { this.fields.put(streamId, fields); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { for (Map.Entry<String, Fields> e : fields.entrySet()) { declarer.declareStream(e.getKey(), e.getValue()); } } @Override public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) { this.config = Configuration.fromMap(conf); this.collector = collector; this.context = context; if (config.getBoolean(METRICS_ENABLED, false)) { context.addTaskHook(new SpoutMeterHook()); } initialize(); } protected String getConfigKey(String template) { return String.format(template, configPrefix); } public void setConfigPrefix(String configPrefix) { this.configPrefix = configPrefix; } protected abstract void initialize(); }