使用笨辦法,實現了一個定時器。
不管怎麼樣,效果很好,可以執行定時任務了。
@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);
}
}
想了很多方法,感覺這個最靠譜。