Почему Quarkus выдает ошибку java.util.ServiceConfigurationError через некоторое время?

У нас есть приложение Quarkus, использующее RestEasy Reactive, Hibernate Reactive (с щегольством) и Hazelcast для кэширования. Когда приложение запускается, конечные точки возвращают ответ без каких-либо исключений. Однако примерно через 10 минут возникает исключение, которое нам трудно понять. Исключение ниже. Единственные подсказки, найденные при возникновении этого исключения, — это количество прошедшего времени (10 минут) и конечные точки, которые используют кеш Hazelcast.

Метод ресурса

      @GET
@APIResponse(
    responseCode = StatusCode.OK,
    description = "Get All Loans",
    content =
        @Content(
            mediaType = MediaType.APPLICATION_JSON,
            schema = @Schema(type = SchemaType.ARRAY, implementation = Loan.class)))
public Uni<List<Loan>> getLoans(final SearchParameters parameters) {
  return getDomainContextAndThen(
      domainContext -> {
        final LoanSearch search =
            LoanSearch.builder()
                .user(domainContext.getAuthenticatedUser())
                .team(domainContext.getTeam())
                .page(parameters.getPage())
                .perPage(parameters.getPerPage())
                .build();

        return loanService.find(search);
      });
}

Служебный метод

      protected <T> Uni<T> getDomainContextAndThen(final Function<DomainContext, Uni<T>> callback) {
  // spotless:off
  return Uni.combine()
      .all().unis(getContextTeam(), getAuthenticatedUser()).asTuple()
      .onItem().transformToUni(
          tuple -> callback.apply(new DomainContext(tuple.getItem1(), tuple.getItem2())));
  // spotless:on
}

Метод обслуживания

      public Uni<List<Loan>> find(final LoanSearch search) {
  if (search.getUser() != null && search.getUser().isBorrower()) {
    return findLoansForBorrower(search);
  }

  return Uni.createFrom().item(new ArrayList<>());
}

private Uni<List<Loan>> findLoansForBorrower(final LoanSearch search) {
  final HQL hql =
      HQL.select()
          .from(LoanEntity.class)
          .join("le.borrowers", "lb")
          .join("lb.borrowerUser", "lbu")
          .joinFetch("le.loTeam", "lt")
          .leftJoinFetch("le.lender", "ll");
  final Condition where = Condition.eq("lbu.email", search.getUser().getEmail());

  if (search.getTeam() != null) {
    where.and(Condition.eq("le.loTeam.id", search.getTeam().getId()));
  }

  hql.where(where);

  return loanRepository
      .find(hql.getQuery(), hql.getParameters())
      .page(search.getPageZeroIndexed(), search.getPerPage())
      .stream()
      .map(loanMapper::toDomain)
      .collect()
      .asList();
}

Исключение:

      java.util.ServiceConfigurationError: io.smallrye.config.SmallRyeConfigFactory: io.quarkus.runtime.configuration.QuarkusConfigFactory not a subtype
    at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1244)
    at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
    at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
    at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
    at io.smallrye.config.SmallRyeConfigProviderResolver.getFactoryFor(SmallRyeConfigProviderResolver.java:100)
    at io.smallrye.config.SmallRyeConfigProviderResolver.getConfig(SmallRyeConfigProviderResolver.java:76)
    at io.smallrye.config.SmallRyeConfigProviderResolver.getConfig(SmallRyeConfigProviderResolver.java:64)
    at org.eclipse.microprofile.config.ConfigProvider.getConfig(ConfigProvider.java:85)
    at io.smallrye.context.impl.DefaultValues.<init>(DefaultValues.java:41)
    at io.smallrye.context.SmallRyeContextManager.<init>(SmallRyeContextManager.java:63)
    at io.smallrye.context.SmallRyeContextManager$Builder.build(SmallRyeContextManager.java:337)
    at io.smallrye.context.SmallRyeContextManagerProvider.getContextManager(SmallRyeContextManagerProvider.java:48)
    at io.smallrye.context.SmallRyeContextManagerProvider.getContextManager(SmallRyeContextManagerProvider.java:37)
    at io.smallrye.context.SmallRyeContextManagerProvider.getManager(SmallRyeContextManagerProvider.java:97)
    at io.smallrye.context.SmallRyeThreadContext.getCurrentThreadContextOrDefaultContexts(SmallRyeThreadContext.java:160)
    at io.smallrye.mutiny.context.DefaultContextPropagationInterceptor.getThreadContext(DefaultContextPropagationInterceptor.java:12)
    at io.smallrye.mutiny.context.BaseContextPropagationInterceptor.decorate(BaseContextPropagationInterceptor.java:24)
    at io.smallrye.mutiny.infrastructure.Infrastructure.decorate(Infrastructure.java:145)
    at io.smallrye.mutiny.groups.UniCreate.item(UniCreate.java:304)
    at io.quarkus.hibernate.reactive.panache.common.runtime.AbstractJpaOperations.getSession(AbstractJpaOperations.java:138)
    at io.quarkus.hibernate.reactive.panache.common.runtime.AbstractJpaOperations.find(AbstractJpaOperations.java:214)
    at io.quarkus.hibernate.reactive.panache.common.runtime.AbstractJpaOperations.find(AbstractJpaOperations.java:209)
    at company.domain.loan.LoanRepository.find(LoanRepository.java)
    at company.domain.loan.LoanRepository_ClientProxy.find(Unknown Source)
    at company.domain.loan.LoanService.findLoansForBorrower(LoanService.java:61)
    at company.domain.loan.LoanService.find(LoanService.java:37)
    at company.domain.loan.LoanService_ClientProxy.find(Unknown Source)
    at company.domain.loan.LoanResource.lambda$getLoans$0(LoanResource.java:76)
    at company.domain.common.resource.SecuredResource.lambda$getDomainContextAndThen$1(SecuredResource.java:41)
    at io.smallrye.context.impl.wrappers.SlowContextualFunction.apply(SlowContextualFunction.java:21)
    at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:68)
    at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57)
    at io.smallrye.mutiny.operators.uni.UniAndCombination$AndSupervisor.computeAndFireTheOutcome(UniAndCombination.java:152)
    at io.smallrye.mutiny.operators.uni.UniAndCombination$AndSupervisor.check(UniAndCombination.java:131)
    at io.smallrye.mutiny.operators.uni.UniAndCombination$UniHandler.onItem(UniAndCombination.java:221)
    at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:60)
    at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:60)
    at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem$KnownItemSubscription.forward(UniCreateFromKnownItem.java:38)
    at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem$KnownItemSubscription.access$100(UniCreateFromKnownItem.java:26)
    at io.smallrye.mutiny.operators.uni.builders.UniCreateFromKnownItem.subscribe(UniCreateFromKnownItem.java:23)
    at io.smallrye.mutiny.operators.AbstractUni.subscribe(AbstractUni.java:36)
    at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.performInnerSubscription(UniOnItemTransformToUni.java:81)
    at io.smallrye.mutiny.operators.uni.UniOnItemTransformToUni$UniOnItemTransformToUniProcessor.onItem(UniOnItemTransformToUni.java:57)
    at io.smallrye.mutiny.operators.uni.UniOnItemTransform$UniOnItemTransformProcessor.onItem(UniOnItemTransform.java:43)
    at io.smallrye.mutiny.operators.uni.builders.UniCreateFromCompletionStage$CompletionStageUniSubscription.forwardResult(UniCreateFromCompletionStage.java:63)
    at com.hazelcast.client.impl.ClientDelegatingFuture$WhenCompleteAdapter.apply(ClientDelegatingFuture.java:525)
    at com.hazelcast.client.impl.ClientDelegatingFuture$WhenCompleteAdapter.apply(ClientDelegatingFuture.java:507)
    at com.hazelcast.client.impl.spi.impl.ClientInvocationFuture$CallIdTrackingBiFunction.apply(ClientInvocationFuture.java:250)
    at com.hazelcast.spi.impl.AbstractInvocationFuture$HandleNode.lambda$execute$0(AbstractInvocationFuture.java:1536)
    at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)

При условииQuarkusConfigFactoryявляется подклассомSmallRyeConfigFactoryЯ ожидал, что он не выдаст исключение, утверждая, что это «не подтип». Пошаговая отладка по исходникам ничего не выявила.

0 ответов

Другие вопросы по тегам