package stormapplied.flashsale.topology;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.topology.ReportedFailedException;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import java.util.List;
import java.util.Map;
import stormapplied.flashsale.services.FlashSaleRecommendationClient;
import stormapplied.flashsale.services.Timeout;
public class FindRecommendedSales extends BaseBasicBolt {
public static final String RETRY_STREAM = "retry";
public static final String SUCCESS_STREAM = "success";
private FlashSaleRecommendationClient client;
@Override
public void prepare(Map config,
TopologyContext context) {
long timeout = (Long)config.get("timeout");
client = new FlashSaleRecommendationClient((int)timeout);
}
@Override
public void execute(Tuple tuple,
BasicOutputCollector outputCollector) {
String customerId = tuple.getStringByField("customer");
try {
List<String> sales = client.findSalesFor(customerId);
if (!sales.isEmpty()) {
outputCollector.emit(SUCCESS_STREAM,
new Values(customerId, sales));
}
} catch (Timeout e) {
outputCollector.emit(RETRY_STREAM, new Values(customerId));
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declareStream(SUCCESS_STREAM, new Fields("customer", "sales"));
outputFieldsDeclarer.declareStream(RETRY_STREAM, new Fields("customer"));
}
}