Vertxの非同期カスタムメソッド

デビッド・マルシエル:

私は自分の非同期カスタムメソッドをVert.xでコードに似たものを作成しようとしています:

// call the external service
WebClient client = WebClient.create(vertx);

client.get(8080, "localhost:8080", "/fast").send(ar -> {
    if (ar.succeeded()) {

        HttpResponse<Buffer> response = ar.result();
        System.out.println("response.bodyAsString()" + response.bodyAsString());

    } else {
        System.out.println("Something went wrong " + ar.cause().getMessage());
    }
});

このコードを実行すると、所有者スレッドをブロックせずにスレッドがスリープ状態になり、エンドポイントが応答すると、提供されたハンドラーが実行されます。

「executeBlocking」、「createSharedWorkerExecutor.executeBlocking」を使用してバスを使用する方法を見つけましたが、それらすべてでスレッドがブロックされます。

コンテナースレッドをブロックせずにそれを行う方法を探していますが、見つかりません。投稿があります:

Vert.xでカスタム非同期操作を実装するにはどうすればよいですか?

私はそれをやろうとしましたが、それもスレッドをブロックします:

vertx.runOnContext(v -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
    }
    handler.handle(Future.succeededFuture("result"));
});

上記のコードは同じスレッドで実行されますが、同時には実行されないため、スレッドがブロックされていると思います。

それを行う方法はありますか?

Erunafailaro:

呼び出す方法はThread.sleep()、現在のJVMスレッドをスリープ状態にして、同じスレッドで実行される現在のvert.xイベントループを効果的にブロックします。これは、vert.xでブロックコードを実行する慣用的な方法ではありません。

ここを参照してください:「ゴールデンルール-イベントループをブロックしないでください」。

などのブロッキングコードを実行する必要がある場合はThread.sleep()ワーカーバーティクルを使用してそのコードを実装する必要がありますワーカーバーティクルは、別のスレッドプールのJVMスレッドを使用するため、イベントループをブロックしません。

上記で投稿した最初のコード例では、あなた自身が正しく説明したように、ブロッキングコードを使用していません。非同期の非ブロッキングイベントハンドラーで慣用的な方法を使用します。

編集する

非常に単純なワーカーバーティクルを開始する方法のこの短い例を参照してください。

クラスからのコードは、WorkerVerticleイベントループを決してブロックしません。に示されているように正しいオプションを設定することにより、バーティクルの展開中にそれをワーカーにしますDeployerVerticle

public class DeployerVerticle extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        System.out.println("Main verticle has started, let's deploy another...");

        // Deploy it as a worker verticle
        vertx.deployVerticle("io.example.WorkerVerticle", 
                             new DeploymentOptions().setWorker(true));
    }
}


// ----

package io.example;
/**
 * An example of a worker verticle
 */
public class WorkerVerticle extends AbstractVerticle {

    @Override
    public void start() throws Exception {
        System.out.println("[Worker] Starting in " +
            Thread.currentThread().getName());

        // consume event bus messages sent to address "sample.data"
        // reply with incoming message transformed to upper case
        vertx.eventBus().<String>consumer("sample.data", message -> {

            Thread.sleep(1000); // will not block the event loop
                                // but only this verticle

            System.out.println("[Worker] Consuming data in " + 
                Thread.currentThread().getName());
            String body = message.body();
            message.reply(body.toUpperCase());
        });
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

mockitoを使用した非同期VertxおよびRxJavaメソッドのテスト

分類Dev

Aureliaカスタムコンポーネントの添付メソッドで非同期作業を行う方法

分類Dev

方法:LINQカスタム拡張メソッドで非同期メソッドを使用する

分類Dev

非同期タスクメソッドWaitingForActivation

分類Dev

カスタムレンダラーのOnElementChangedメソッド内で非同期メソッドを実行する方法

分類Dev

待つ必要のない非同期タスクメソッド

分類Dev

非同期リコンシラーメソッドを使用したカスタムReactレンダラー

分類Dev

非同期タスク中にフォームを閉じるときのconvertメソッドの例外

分類Dev

ArrayListのカスタムメソッド

分類Dev

カスタムLinkedListのメソッド

分類Dev

非同期データベースメソッドの単体テスト

分類Dev

非同期メソッドのモック

分類Dev

Android:メソッドの非同期スレッド

分類Dev

非同期タスクメソッドから「通常の」変数を返す

分類Dev

タスクのみを返す非同期メソッドでawaitを使用する

分類Dev

インターフェイスの非同期メソッドを呼び出す

分類Dev

非同期から同期メソッドへのDartのスタックへの例外の受け渡し

分類Dev

非同期メソッドを作成し、別のメソッドからタスク結果を設定します

分類Dev

カスタムメソッドと@Gatewaysメソッドで@Asyncアノテーションを使用した非同期プロセスでのエラーの処理

分類Dev

非同期タスク<bool>メソッド呼び出しif条件

分類Dev

doInBackgroundメソッドで発生する非同期タスク#1

分類Dev

非同期メソッドの混乱

分類Dev

AzureFunctionsの課金非同期メソッド

分類Dev

非同期mongoDBfind()メソッドの問題

分類Dev

非同期メソッドのFatalExecutionEngineError

分類Dev

Global.asaxの非同期メソッド

分類Dev

非同期getメソッドの処理

分類Dev

NodeJSの非同期メソッド

分類Dev

NodeJSの非同期メソッド

Related 関連記事

  1. 1

    mockitoを使用した非同期VertxおよびRxJavaメソッドのテスト

  2. 2

    Aureliaカスタムコンポーネントの添付メソッドで非同期作業を行う方法

  3. 3

    方法:LINQカスタム拡張メソッドで非同期メソッドを使用する

  4. 4

    非同期タスクメソッドWaitingForActivation

  5. 5

    カスタムレンダラーのOnElementChangedメソッド内で非同期メソッドを実行する方法

  6. 6

    待つ必要のない非同期タスクメソッド

  7. 7

    非同期リコンシラーメソッドを使用したカスタムReactレンダラー

  8. 8

    非同期タスク中にフォームを閉じるときのconvertメソッドの例外

  9. 9

    ArrayListのカスタムメソッド

  10. 10

    カスタムLinkedListのメソッド

  11. 11

    非同期データベースメソッドの単体テスト

  12. 12

    非同期メソッドのモック

  13. 13

    Android:メソッドの非同期スレッド

  14. 14

    非同期タスクメソッドから「通常の」変数を返す

  15. 15

    タスクのみを返す非同期メソッドでawaitを使用する

  16. 16

    インターフェイスの非同期メソッドを呼び出す

  17. 17

    非同期から同期メソッドへのDartのスタックへの例外の受け渡し

  18. 18

    非同期メソッドを作成し、別のメソッドからタスク結果を設定します

  19. 19

    カスタムメソッドと@Gatewaysメソッドで@Asyncアノテーションを使用した非同期プロセスでのエラーの処理

  20. 20

    非同期タスク<bool>メソッド呼び出しif条件

  21. 21

    doInBackgroundメソッドで発生する非同期タスク#1

  22. 22

    非同期メソッドの混乱

  23. 23

    AzureFunctionsの課金非同期メソッド

  24. 24

    非同期mongoDBfind()メソッドの問題

  25. 25

    非同期メソッドのFatalExecutionEngineError

  26. 26

    Global.asaxの非同期メソッド

  27. 27

    非同期getメソッドの処理

  28. 28

    NodeJSの非同期メソッド

  29. 29

    NodeJSの非同期メソッド

ホットタグ

アーカイブ