使用笨办法,实现了一个定时器。
不管怎么样,效果很好,可以执行定时任务了。
@Singleton
public class BuildingImportTimer {
private static Logger logger = LoggerFactory.getLogger(BuildingImportTimer.class);
@Inject
private BuildingImportHisService service;
public static void main(String[] args) throws Exception {
Injector injector = Guice.createInjector();
BuildingImportTimer importTimer = injector.getInstance(BuildingImportTimer.class);
SparkConf conf = getConf(NEW_BUILDING_STREAM);
JavaStreamingContext context = new JavaStreamingContext(conf, Durations.minutes(10));
JavaReceiverInputDStream<Integer> stream = context.receiverStream(
new BuildingImportReceiver(StorageLevel.MEMORY_ONLY()));
stream.foreachRDD(n -> logger.info("loop for: {}.", n));
context.start();
context.awaitTermination();
}
}
重点是JavaStreamingContext,以及使用receiverStream方法。
自定义的Receiver非常简单
public class BuildingImportReceiver extends Receiver<Integer> {
private final AtomicInteger num = new AtomicInteger();
@Override
public void onStart() {
store(num.decrementAndGet());
}
@Override
public void onStop() {
}
public BuildingImportReceiver(StorageLevel storageLevel) {
super(storageLevel);
}
}
想了很多方法,感觉这个最靠谱。