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 java.util.Map;
import static backtype.storm.utils.Utils.tuple;
public class EmitSpecialWordGivenProbabilitySpout extends BaseRichSpout
{
private static final long serialVersionUID = 1L;
private final String specialWord;
private final int sleepMillisecsAfterEmission;
private final double defaultWordEmissionProbability;
private transient SpoutOutputCollector collector;
public EmitSpecialWordGivenProbabilitySpout(String specialWord, double emissionProbability, int timesPerSec) {
if (emissionProbability < 0 || emissionProbability > 1.0 ) {
throw new IllegalArgumentException("Probability must be between 0 and 1.0");
}
this.specialWord = specialWord;
this.defaultWordEmissionProbability = 1.0 - emissionProbability;
this.sleepMillisecsAfterEmission = 1000 / timesPerSec;
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer)
{
declarer.declare(new Fields("word"));
}
@Override
public void nextTuple()
{
String wordToEmit = "default";
if (Math.random() > defaultWordEmissionProbability) {
wordToEmit = specialWord + Math.floor ((Math.random() * 100));
}
collector.emit( tuple(wordToEmit));
System.out.println("+++++emitted: " + wordToEmit);
try {
Thread.sleep(sleepMillisecsAfterEmission);
} catch (InterruptedException e) {
System.out.println("Fatal error");
System.exit(-1);
}
}
@Override
public void open(@SuppressWarnings("rawtypes") Map conf,
TopologyContext context,
SpoutOutputCollector collector)
{
this.collector = collector;
}
@Override
public void close() {}
@Override
public void ack(Object msgId) {}
@Override
public void fail(Object msgId) {}
}