Поддерживает ли Vertx 3 CompletableFuture?

Я хочу разработать свой стиль обещания приложения, используя vertx, и CompletableFuture действительно подходит для этой цели, но JVM использует fork/join в фоновом режиме для CompletableFuture, и это может нарушить безопасность Vertx Thread.

У вас есть идеи или вы использовали эту функцию в своем проекте?


person firstthumb    schedule 29.06.2016    source источник
comment
Вы пробовали (или смотрели) JavaRx?   -  person x80486    schedule 29.06.2016


Ответы (3)


Да, это так, вот пример http://qrman.github.io/posts/2015/08/28/callback_hell_completablefuture_ftw/

Но я думаю, что JavaRx — лучшее решение, потому что он поддерживается vert.x как первоклассный гражданин http://vertx.io/docs/vertx-rx/java/

person haschibaschi    schedule 03.07.2016

Существует также https://github.com/cescoffier/vertx-completable-future. . Из README:

Этот проект предоставляет Completable Future API, но применяет поточную модель Vert.x:

  • При использовании методов xAsync (без исполнителя) обратные вызовы вызываются в контексте Vert.x.
  • При использовании неасинхронного режима используется поток вызывающей стороны. Если это поток Vert.x, используется тот же поток. Если он не вызывается из потока Vert.x, он все равно использует поток вызывающего абонента.
  • При использовании методов xAsync с параметром Executor этот исполнитель используется для выполнения обратного вызова (не применяет систему потоков Vert.x).

Хотя еще не пользовался.

person adave    schedule 15.01.2017

технически всегда возможно выполнять асинхронные операции с другими потоками, которые не управляются Vertx, и возвращать результат для использования управляемым потоком Vertx. Ключ в том, чтобы получить Context перед запуском асинхронной операции с использованием vertx.getOrCreateContext(), а затем использовать его для возврата результата, когда он будет готов.

Предполагая, что у вас есть Handler<AsyncResult<>>, это может быть пример кода:

public void doAsyncThing(String someParam, String otherParam, Handler<AsyncResult<Void>> resultHandler) {
    Context vertxContext = vertx.getOrCreateContext();
    CompletableFuture<Void> future = 
        someOperatinThatTriggersAsync(someParam, otherParam)
            .handleAsync((unused, throwable) -> {
                vertxContext.runOnContext(unused1 -> {
                if (throwable == null) {
                  responseHandler.handle(Future.succeededFuture());
                } else {
                  responseHandler.handle(Future.failedFuture(throwable));
                }
            });

            return null;
          });
}
person mohamnag    schedule 17.11.2020