Stream 创建一个Apache Storm Spoot,它每X秒发出一次元组
我有一个从MQTT代理接收数据的拓扑,我希望一个喷口的行为如下:Stream 创建一个Apache Storm Spoot,它每X秒发出一次元组,stream,apache-storm,mqtt,trident,Stream,Apache Storm,Mqtt,Trident,我有一个从MQTT代理接收数据的拓扑,我希望一个喷口的行为如下: 每x秒发出一批元组(或单个元组中的字符串列表)。我如何做到这一点?我读了一些关于Storm Trident的文章,但它的IBatchSpout似乎不允许我以特定的时间间隔批量发出元组 如果没有新数据输入,喷口应该怎么做?它不能阻止线程,因为它是Storm的主线程,对吗 您可以实现自己的MQTT喷口。例如,请看一看 重要的部分是方法 调用此方法时,Storm请求喷口发射 将元组添加到输出收集器。这个方法应该是非阻塞的,所以 如果喷口
IBatchSpout
似乎不允许我以特定的时间间隔批量发出元组您可以实现自己的MQTT喷口。例如,请看一看 重要的部分是方法 调用此方法时,Storm请求喷口发射 将元组添加到输出收集器。这个方法应该是非阻塞的,所以 如果喷口没有要发出的元组,则此方法应返回。 nextTuple、ack和fail都是在一个单独的内存中在紧循环中调用的 线程在喷口任务。如果没有要发出的元组,则为 有礼貌地在短时间内进行下一次三次睡眠(如 一毫秒)以避免浪费太多CPU 您不能一次等待指定的时间,但可以实现
nextTuple
,以便它每隔一段时间只发出一次元组
private static final EMISSION_PERIOD = 2000; // 2 seconds
private long lastEmission;
@Override
public void nextTuple() {
if (lastEmission == null ||
lastEmission + EMISSION_PERIOD >= System.currentMillis()) {
List<Object> tuple = pollMQTT();
if (tuple != null) {
this.collector.emit(tuple);
return;
}
}
Utils.sleep(50);
}
private static final EMISSION\u PERIOD=2000;//2秒
私人长时间发射;
@凌驾
public void nextTuple(){
如果(lastEmission==null||
lastEmission+EMISSION\u PERIOD>=System.currentMillis(){
List tuple=pollMQTT();
if(元组!=null){
this.collector.emit(tuple);
返回;
}
}
睡眠(50);
}
请注意,我发现了一个开放源代码。它看起来还没有准备好生产,但您可以将其作为一个起点。除了Christian之外,我还为Storm的MQTT客户端找到了它。前面提到的链接尚未开发