[英]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 的BroadcastProcessor
和Multi
時做錯了。
啟動第一個GraphQL Subscription
查詢以訂閱topic-1 :
BroadcastProcessor
實例以將MQTT服務器消息橋接到客戶端publishHandler
設置有一個處理程序,該處理程序使用先前(新)創建的BroadcastProcessor
實例來發送項目subscribe
新主題BroadcastProcessor
實例將Quarkus訂閱以將消息流式傳輸到客戶端在一次調用中一切都很好。 該問題將出現在下一個訂閱topic-2的GraphQL訂閱查詢中:
BroadcastProcessor
實例以將MQTT服務器消息橋接到客戶端(這很好)publishHandler
被另一個處理程序覆蓋,該處理程序使用先前創建的BroadcastProcessor
實例發送項目subscribe
了一個新主題(第二個)BroadcastProcessor
實例將Quarkus訂閱以將消息流式傳輸到客戶端在第二次調用( GraphQL訂閱查詢)時,您的 MQTT 客戶端最終會擁有一個publishHandler
橋接來自您訂閱的任何MQTT主題的消息(在上述場景中topic-1和topic-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.