Stream 创建一个Apache Storm Spoot,它每X秒发出一次元组

Stream 创建一个Apache Storm Spoot,它每X秒发出一次元组,stream,apache-storm,mqtt,trident,Stream,Apache Storm,Mqtt,Trident,我有一个从MQTT代理接收数据的拓扑,我希望一个喷口的行为如下: 每x秒发出一批元组(或单个元组中的字符串列表)。我如何做到这一点?我读了一些关于Storm Trident的文章,但它的IBatchSpout似乎不允许我以特定的时间间隔批量发出元组 如果没有新数据输入,喷口应该怎么做?它不能阻止线程,因为它是Storm的主线程,对吗 您可以实现自己的MQTT喷口。例如,请看一看 重要的部分是方法 调用此方法时,Storm请求喷口发射 将元组添加到输出收集器。这个方法应该是非阻塞的,所以 如果喷口

我有一个从MQTT代理接收数据的拓扑,我希望一个喷口的行为如下:

  • 每x秒发出一批元组(或单个元组中的字符串列表)。我如何做到这一点?我读了一些关于Storm Trident的文章,但它的
    IBatchSpout
    似乎不允许我以特定的时间间隔批量发出元组

  • 如果没有新数据输入,喷口应该怎么做?它不能阻止线程,因为它是Storm的主线程,对吗


  • 您可以实现自己的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客户端找到了它。前面提到的链接尚未开发