package resa.evaluation.simulate;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;
import backtype.storm.utils.Utils;
import redis.clients.jedis.Jedis;
import resa.util.ConfigUtil;
import java.util.Map;
import java.util.stream.Stream;
/**
* Created by ding on 14-7-29.
*/
public class SimulatedLoader extends BaseBasicBolt {
@Override
public void prepare(Map stormConf, TopologyContext context) {
long currTime = System.currentTimeMillis();
boolean needLoadData = Stream.of(((String) stormConf.get("data-tasks")).split(",")).mapToInt(Integer::parseInt)
.anyMatch(i -> i == context.getThisTaskIndex());
if (needLoadData) {
long sleep = ConfigUtil.getIntThrow(stormConf, "simulate.data-loader.sleep");
// int rand = (int) (Math.random() * sleep * 0.2);
// if (rand % 2 == 0) {
// sleep = sleep + rand;
// } else {
// sleep = sleep - rand;
// }
Utils.sleep(sleep);
}
long cost = System.currentTimeMillis() - currTime;
context.getSharedExecutor().submit(() -> writeTimeToRedis(stormConf, context, cost));
}
private void writeTimeToRedis(Map conf, TopologyContext context, long time) {
Jedis jedis = new Jedis((String) conf.get("redis.host"), ConfigUtil.getInt(conf, "redis.port", 6379));
jedis.set(context.getStormId() + "-" + context.getThisComponentId() + "-" + context.getThisTaskId()
+ "-start-time", time < 1000 ? "zero" : String.valueOf(time));
jedis.disconnect();
}
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
// long now = System.currentTimeMillis();
// do {
for (int i = 0; i < 10; i++) {
Math.atan(Math.sqrt(Math.random() * Integer.MAX_VALUE) * Math.PI);
}
// } while (System.currentTimeMillis() - now > 1);
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
}
}