在我的Spark Streaming应用程序中,我正在读取某些Kafka主题的数据。每当我遇到某些消息(例如:“毒药”)时从主题中读取,我想停止流式传输。目前我使用以下代码实现此目的:
jsc
是JavaStreamingContext的实例,directStream
是JavaPairInputDStream的实例。
LongAccumulator poisonNotifier = sc.longAccumulator("poisonNotifier");
directStream.foreachRDD(rdd -> {
RDD<Row> rows = rdd.values().map(value -> {
if (value.equals("poison") {
poisonNotifier.add(1);
} else {
...
}
return row;
}).rdd();
});
jsc.start();
ExecutorService poisonMonitor = Executors.newSingleThreadExecutor();
poisonMonitor.execute(() -> {
while (true) {
if (poisonNotifier.value() > 0) {
jsc.stop(false, true);
break;
}
}
});
try {
jsc.awaitTermination();
} catch (InterruptedException e) {
e.printStackTrace();
}
poisonMonitor.shutdown();
虽然这种方法有效,但这对我来说听起来并不合适。还有其他更好(更清洁)的方法来实现同样的目标吗?