簡體   English   中英

如何同時調用多個 Uni

[英]How to call multiple Uni concurrently

最近,我正在做一個項目,我有 2 個同時進行 2 個異步調用。 由於我正在使用 Quarkus,我最終嘗試使用 Mutiny 和 vert.x 庫。 但是,我無法讓我的代碼與 Unis 一起使用。 在下面的代碼中,我想兩個 Unis 都會被調用,並且返回最快的 Uni 會被返回。 但是,似乎在組合 Unis 時,它只是返回列表中的第一個,即使第一個 uni 應該花費更長的時間。

下面的代碼在應該打印出two two時打印出one one ,因為 uniFast 應該首先完成。 我如何結合 Unis 並讓更快的一個先返回?

@Test
    public void testUniJion(){
        var uniSLow = Uni.createFrom().item(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "one";
        });

        var uniFast = Uni.createFrom().item(() -> {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "two";
        });

        var resp = Uni.join().first(uniSLow,uniFast).withItem().await().indefinitely();
        System.out.println(resp);

        var resp2 = Uni.combine().any().of(uniSLow,uniFast).await().indefinitely();
        System.out.println(resp2);
    }

注意:這不是我要實現的實際代碼。 在我的代碼中,我試圖從 2 個不同的數據庫中獲取。 但是,一個數據庫通常比另一個數據庫有更多的延遲。 但是,Uni 似乎總是等待較慢的數據庫。 我只是想更好地理解 Mutiny 和 Uni,所以我制作了這個代碼示例。

問題是你沒有告訴Mutiny應該在哪個線程上運行每個 uni。 如果我將System.out添加到您的示例中:

// Slow and Fast for the different Uni
System.out.println( "Slow - " + Thread.currentThread().getId() + ":" + Thread.currentThread().getName() );

我得到以下輸出:

Slow - 1:Test worker
one
Slow - 1:Test worker
Fast - 1:Test worker
one

輸出顯示所有東西都在同一個線程上運行,因此當我們阻塞第一個線程時,第二個線程也被阻塞了。 這就是為什么輸出是one one的原因。

並行運行 uni 的一種方法是在訂閱時使用不同的執行器:

ExecutorService executorService = Executors.newFixedThreadPool( 5 );
uniSlow = uniSlow.runSubscriptionOn( executorService );
uniFast = uniFast.runSubscriptionOn( executorService );

現在,當我運行測試時,我得到了預期的輸出:

Slow - 16:pool-3-thread-1
Fast - 17:pool-3-thread-2
two
Slow - 18:pool-3-thread-3
Fast - 19:pool-3-thread-4
two

請注意,這一次 Slow 和 Fast 運行在不同的線程上。

Mutiny 指南中有一節介紹了emitOn 與 runSubscriptionOn之間的區別以及一些關於如何更改發射線程的示例

暫無
暫無

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

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