簡體   English   中英

從 vert.x mqtt 客戶端發布到多個流

[英]Publish to multiple streams from vert.x mqtt client

我有一個暴露GraphQL服務器的Quarkus應用程序。

該服務器公開了一個訂閱,我用它來與前端進行實時通信。

我還有一個Vert.x MQTT客戶端( MQTT充當消息代理)。

當我調用突變時,我也會發布到MQTT主題。

GraphQL訂閱應該從MQTT發布的消息中返回一個流。

這是MQTT訂閱的代碼:

public Multi<String> subscribe(String topic) {

    BroadcastProcessor<String> processor = BroadcastProcessor.create();

    client.publishHandler(s -> {
                System.out.println(s.topicName() + " " + s.payload());
                processor.onNext(s.payload().toString());
            })
            .subscribe(topic, 2);

    return processor;
}

下面是GraphQL訂閱的代碼:

@Subscription
public Multi<String> messageCreated(String topic) {
    return client.subscribe(topic).toHotStream();

}

我的問題是,當我在不同主題上發布時, GraphQL訂閱會收到我發送的每條消息。 MQTT客戶端訂閱工作正常)。

我認為我在使用 Mutiny 的BroadcastProcessorMulti時做錯了。

啟動第一個GraphQL Subscription查詢以訂閱topic-1

  1. 創建一個新的BroadcastProcessor實例以將MQTT服務器消息橋接到客戶端
  2. MQTT客戶端(共享實例) publishHandler設置有一個處理程序,該處理程序使用先前(新)創建的BroadcastProcessor實例來發送項目
  3. MQTT客戶端subscribe新主題
  4. 返回的BroadcastProcessor實例將Quarkus訂閱以將消息流式傳輸到客戶端

在一次調用中一切都很好。 該問題將出現在下一個訂閱topic-2GraphQL訂閱查詢中:

  1. 創建另一個新的BroadcastProcessor實例以將MQTT服務器消息橋接到客戶端(這很好)
  2. MQTT客戶端(共享實例) publishHandler被另一個處理程序覆蓋,該處理程序使用先前創建的BroadcastProcessor實例發送項目
  3. MQTT客戶端subscribe一個新主題(第二個)
  4. 返回的BroadcastProcessor實例將Quarkus訂閱以將消息流式傳輸到客戶端

在第二次調用( GraphQL訂閱查詢)時,您的 MQTT 客戶端最終會擁有一個publishHandler橋接來自您訂閱的任何MQTT主題的消息(在上述場景中topic-1topic-2 )。

您可以使用共享BroadcastProcessor並按訂閱主題過濾傳出的流消息:

BroadcastProcessor<String> processor = BroadcastProcessor.create();
Multi<String> stream = processor.toHotStream();

client.publishHandler(s -> {
    processor.onNext(Tuple2.of(s.getTopicName(),  s.payload().toString());
});

然后在GraphQL訂閱處理程序中:

@Subscription
public Multi<String> messageCreated(String topic) {
    client.subscribe(topic);
    return stream.select()
            .where(tuple -> tuple.getItem1().equals(topic));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM