package com.packtpub.storm.trident.state;
import backtype.storm.task.IMetricsContext;
import com.fasterxml.jackson.databind.jsontype.NamedType;
import com.metamx.common.lifecycle.Lifecycle;
import com.metamx.druid.realtime.RealtimeNode;
import com.packtpub.druid.firehose.StormFirehoseFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import storm.trident.state.State;
import storm.trident.state.StateFactory;
import java.util.Map;
@SuppressWarnings("rawtypes")
public class DruidStateFactory implements StateFactory {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(DruidStateFactory.class);
private static RealtimeNode rn = null;
private static synchronized void startRealtime() {
if (rn == null) {
final Lifecycle lifecycle = new Lifecycle();
rn = RealtimeNode.builder().build();
lifecycle.addManagedInstance(rn);
rn.registerJacksonSubtype(new NamedType(StormFirehoseFactory.class, "storm"));
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
LOG.info("Running shutdown hook");
lifecycle.stop();
}
}));
try {
lifecycle.start();
} catch (Throwable t) {
LOG.info("Throwable caught at startup, committing seppuku", t);
t.printStackTrace();
System.exit(2);
}
}
}
@Override
public State makeState(Map conf, IMetricsContext metrics, int partitionIndex, int numPartitions) {
DruidStateFactory.startRealtime();
return new DruidState(partitionIndex);
}
}