package resa.evaluation.simulate;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import java.util.Map;
/**
* Created by ding on 14-7-1.
*/
public class SimulatedBolt extends BaseRichBolt {
public SimulatedBolt(double lambda) {
this.lambda = lambda;
}
private OutputCollector collector;
private double lambda;
private long bound;
@Override
public void prepare(Map map, TopologyContext context, OutputCollector outputCollector) {
this.collector = outputCollector;
bound = (long) (lambda * 10 * 1_000_000L);
}
@Override
public void execute(Tuple tuple) {
long cost;
long exp = Math.min((long) (-Math.log(Math.random()) * lambda) * 1_000_000L, bound);
long now = System.nanoTime();
do {
for (int i = 0; i < 10; i++) {
Math.atan(Math.sqrt(Math.random() * Integer.MAX_VALUE));
}
} while ((cost = (System.nanoTime() - now)) > 0 && cost < exp);
collector.emit(tuple, tuple.getValues());
collector.ack(tuple);
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("text"));
}
}