quarkus-vertx:来自 Verticle 的非阻塞数据库调用导致 ContextNotActiveException

quarkus-vertx: non-blocking db call from verticle results in ContextNotActiveException

我通过 Vert.x EventBus 发送消息。监听 Verticle 开始对后端进行非阻塞调用以从数据库中读取所有实体。我的问题是调用数据库时出现异常:ContextNotActiveException。我尝试了 panache 和 spring-data 并在这两种情况下得到了相同的结果(它们可能都犯了同样的错误!?)。

@Path("/vertx")
@Log
public class ApiVertx extends AbstractVerticle {
    @Inject
    EventBus eventBus;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public void getViaSpringData() {
        System.out.println("\n-send to bus: START");
        eventBus.request(ConsumerAsyncSpringData.CONSUMER_ADR_SPRING_DATA, "", event -> {
            System.out.println("\tRespons is ready.");
            if (event.succeeded()) {
                System.out.println("\tSuccess: " + event.result()
                        .body());
            } else {
                System.out.println("\tSuccess: NO!!!!!!!!!!!!!!!!!!!");
            }
        });
        System.out.println("+send to bus: OK");
    }
}

@ApplicationScoped
public class ConsumerAsyncPanache extends AbstractVerticle {
    public static final String CONSUMER_ADR_PANACHE = "CONSUMER_ADR_PANACHE";

    @ConsumeEvent(ConsumerAsyncPanache.CONSUMER_ADR_PANACHE)
//    @ActivateRequestContext
    @Transactional
    public CompletionStage<String> getAllPets(String str) throws Exception {
        System.out.println("-------------------------- ConsumerAsyncPanache started");
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        return CompletableFuture.supplyAsync(() -> {
            try {
                List<Pet> petLst = Pet.listAll(Sort.by("name"));
            } catch (Exception e) {
                System.out.println("############################### " + e.toString());
                throw e;
            }
            return "testString";
        }, executorService);
    }
}
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Pet extends PanacheEntity {
    @Column(length = 40, unique = true)
    public String name;
}

curl localhost:8080/vertx 产生以下内容

-send to bus: START
+send to bus: OK
-------------------------- ConsumerAsyncPanache started
############################### javax.enterprise.context.ContextNotActiveException: interface 
javax.enterprise.context.RequestScoped
        Respons is ready.
        Success: NO!!!!!!!!!!!!!!!!!!!

一种使用 spring 数据的方法。结果一样。

@ApplicationScoped
public class ConsumerAsyncSpringData extends AbstractVerticle {
    public static final String CONSUMER_ADR_SPRING_DATA = "CONSUMER_ADR_SPRING_DATA";

    @Inject
    private FruitRepository fruitRepository;

    @ConsumeEvent(ConsumerAsyncSpringData.CONSUMER_ADR_SPRING_DATA)
    public CompletionStage<String> getAllPets(String str) throws Exception{
        System.out.println("-------------------------- consumer started");
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        return CompletableFuture.supplyAsync(() -> {
            try {
                fruitRepository.findAll();
            } catch (Exception e) {
                System.out.println("############################### " + e.toString());
                throw e;
            }
            return "Spring-Data";
        }, executorService);
    }
}
public interface FruitRepository extends CrudRepository<Fruit, Long> {}

对应输出

-send to bus: START
+send to bus: OK
-------------------------- ConsumerAsyncSpringData started
############################### javax.enterprise.context.ContextNotActiveException: 
interface javax.enterprise.context.RequestScoped
        Respons is ready.
        Success: NO!!!!!!!!!!!!!!!!!!!

我遇到了类似的问题并用 smallrye-context-propagation 解决了 延期。请查看此 ,它解释了它是如何解决的。