【问题标题】:Quarkus: ContextNotActiveException when i call db from verticleQuarkus:当我从 Verticle 调用 db 时出现 ContextNotActiveException
【发布时间】:2020-02-22 18:05:58
【问题描述】:

当我尝试从一个顶点调用数据库时,我得到一个 ContextNotActiveException。 当通过 Rest 路由器调用时,一切正常。

部署 Verticle:

@Inject
Vertx vertx;

void onStart(@Observes StartupEvent startupEvent) {
    DeploymentOptions deploymentOptions = new DeploymentOptions();
    deploymentOptions.setWorker(true);
    deploymentOptions.setWorkerPoolSize(DEFAULT_WORKER_POOL_SIZE);

    vertx.deployVerticle(new FileFinderForSaveWorker(), deploymentOptions);
}

我的 Verticle:

public class FileFinderForSaveWorker extends AbstractVerticle {

 @Override
 public void start(Promise<Void> startPromise) throws Exception {

    try {

        List<Media> mediaList = new MediaRepository().listAll();

    } catch (Exception e) {
        e.printStackTrace();
    }

 }
}

这一行出现异常:

List<Media> mediaList = new MediaRepository().listAll();

javax.enterprise.context.ContextNotActiveException:接口 javax.enterprise.context.RequestScoped 在 io.quarkus.hibernate.orm.runtime.RequestScopedEntityManagerHolder_ClientProxy.arc$delegate(RequestScopedEntityManagerHolder_ClientProxy.zig:83) 在 io.quarkus.hibernate.orm.runtime.RequestScopedEntityManagerHolder_ClientProxy.getOrCreateEntityManager(RequestScopedEntityManagerHolder_ClientProxy.zig:191) 在 io.quarkus.hibernate.orm.runtime.entitymanager.TransactionScopedEntityManager.getEntityManager(TransactionScopedEntityManager.java:78) 在 io.quarkus.hibernate.orm.runtime.entitymanager.TransactionScopedEntityManager.createQuery(TransactionScopedEntityManager.java:317) 在 io.quarkus.hibernate.orm.runtime.entitymanager.ForwardingEntityManager.createQuery(ForwardingEntityManager.java:142) 在 io.quarkus.hibernate.orm.panache.runtime.JpaOperations.findAll(JpaOperations.java:328) 在 io.quarkus.hibernate.orm.panache.runtime.JpaOperations.listAll(JpaOperations.java:340) 在 ru.npc.sapsan.domain.repository.MediaRepository.listAll(MediaRepository.java) 在 ru.npc.sapsan.core.worker.FileFinderForSaveWorker.start(FileFinderForSaveWorker.java:18) 在 io.vertx.core.impl.DeploymentManager.lambda$doDeploy$9(DeploymentManager.java:556) 在 io.vertx.core.impl.ContextImpl.executeTask(ContextImpl.java:369) 在 io.vertx.core.impl.WorkerContext.lambda$wrapTask$0(WorkerContext.java:35) 在 io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 在 java.lang.Thread.run(Thread.java:748)

我认为 context-propagation 应该可以帮助我,但它不起作用。

我在 build.gradle 中的依赖:

    dependencies {
      annotationProcessor 'org.projectlombok:lombok:1.18.10'
      compileOnly 'org.projectlombok:lombok:1.18.10'
      implementation 'io.quarkus:quarkus-smallrye-reactive-streams-operators'
      implementation 'io.quarkus:quarkus-smallrye-context-propagation-parent:1.2.1.Final'
      implementation 'io.quarkus:quarkus-jdbc-postgresql'
      implementation 'io.quarkus:quarkus-hibernate-orm-panache'
      implementation 'io.quarkus:quarkus-tika'
      implementation 'io.quarkus:quarkus-vertx-web'
      implementation 'io.quarkus:quarkus-smallrye-openapi'
      implementation 'io.quarkus:quarkus-vertx'
      implementation 'io.quarkus:quarkus-flyway'
      implementation 'io.quarkus:quarkus-hibernate-orm'
      implementation 'org.projectlombok:lombok:1.18.10'
      implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
      implementation 'io.quarkus:quarkus-resteasy'
      implementation 'org.xerial.snappy:snappy-java:1.1.7.3'
      implementation 'org.reflections:reflections:0.9.11'

      testImplementation 'io.quarkus:quarkus-junit5'
      testImplementation 'io.rest-assured:rest-assured'
     }

我使用 hibernate-orm-panache

存储库:

 @ApplicationScoped
 public class MediaRepository implements PanacheRepository<Media> {
 }

实体:

@Data
@Entity
@EqualsAndHashCode(callSuper = false)
@Table(name = "media")
public class Media extends PanacheEntity {

   @SerializedName("uuid")
   @Column(name = "uuid", unique = true, nullable = false, columnDefinition = "varchar(36)", length = 36, updatable = false)
   private String uuid = "";

}

问候。

【问题讨论】:

    标签: vert.x entitymanager quarkus


    【解决方案1】:

    您正在使用幕后的 Panache 是托管 JPA/Hibernate,它可能需要 CDI 上下文才能运行。这就是为什么当您通过 rest 调用它时它可以正常工作的原因,因为 CDI 已经启动。如果您想在 Quarkus 中使用 vert.x 路由,我建议您将 Quarkus reactive-routes 与您已经配置的上下文传播一起使用以实现您的目标。

    【讨论】:

    • 我需要在verticle中调用DB。我可以以某种方式等待 CDI 启动或类似的事情吗?
    • 如果你想从verticle调用db,那么使用vert.x jdbc驱动。你能详细解释一下你的用例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 2015-11-01
    相关资源
    最近更新 更多