Quarkus: блокировка метода службы grpc, работающего в цикле событий
Я реализую сервер gprc в quarkus (1.8.3.Final
). Мой сервис написан в реактивном стиле (smallrye mutiny) Это мой класс обслуживания
@Singleton
@Blocking
@Slf4j
public class GrpcService extends MutinyGrpcServicesGrpc.GrpcServicesImplBase{
@Blocking
public Uni<MyResponse> executeMyLogic(MyRequest request) {
System.out.println("grpc thread name "+Thread.currentThread().getName());
...
}
}
Теперь фактическая логика написана внутри
executeMyLogic
является битовой блокировкой и приводил к блокировке предупреждений цикла событий (и некоторых других ошибок) с помощью vertx. Итак, как упоминалось в руководстве по серверу quarkus grpc (https://quarkus.io/guides/grpc-getting-started), я аннотировал метод с помощью
@Blocking (io.smallrye.common.annotation.Blocking)
.
Прежде чем добавить эту аннотацию, я получил этот журнал на sys.outgrpc thread name vert.x-eventloop-thread-0
что указывает на то, что эта логика выполняется в цикле событий vertx, который, по всей видимости, вызывает проблему.
Теперь, согласно моему пониманию, после добавления этой аннотации @Blocking в
executeMyLogic
это должно выполняться в каком-то рабочем потоке. Но он все еще работает в цикле событий vertx.
Похоже, эта аннотация не соблюдается фреймворком.
Исправьте меня, если я неправильно понимаю, или, пожалуйста, помогите мне заставить это работать.
1 ответ
Как оказалось, это была ошибка в фреймворке quarkus. Ранее он не учитывал аннотацию @Blocking. Заработало после обновления до
1.10.2.Final