Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当从EventBus@ConsumeEvent调用时,Quarkus Panache存储库调用以静默方式失败_Java_Quarkus_Vertx Eventbus_Quarkus Panache - Fatal编程技术网

Java 当从EventBus@ConsumeEvent调用时,Quarkus Panache存储库调用以静默方式失败

Java 当从EventBus@ConsumeEvent调用时,Quarkus Panache存储库调用以静默方式失败,java,quarkus,vertx-eventbus,quarkus-panache,Java,Quarkus,Vertx Eventbus,Quarkus Panache,Quarkus 1.8.3.1最终版本 直接调用访问PanacherRepository的方法可以按预期工作,但是当通过EventBus调用同一方法时,调用到达该方法并执行每一行,直到它到达任何存储库调用,然后在没有任何发生的指示的情况下无声地失败/退出 根据日志,直接调用在Quarkus主线程中执行,eventbus调用在vert.x-eventloop-Thread-2中执行 还尝试了以下步骤的组合,结果相同: 将EventBus的消费者端包装到一个叛变的Uni 使消费者返回Uni 使使用

Quarkus 1.8.3.1最终版本

直接调用访问PanacherRepository的方法可以按预期工作,但是当通过EventBus调用同一方法时,调用到达该方法并执行每一行,直到它到达任何存储库调用,然后在没有任何发生的指示的情况下无声地失败/退出

根据日志,直接调用在Quarkus主线程中执行,eventbus调用在vert.x-eventloop-Thread-2中执行

还尝试了以下步骤的组合,结果相同:

  • 将EventBus的消费者端包装到一个叛变的Uni
  • 使消费者返回Uni
  • 使使用者显式阻塞=false(默认值)
  • 正在尝试io.vertx.core.eventbus.eventbus和io.vertx.mutiny.core.eventbus.eventbus实现
  • 将消费者置于相同和不同的服务
  • 在被调用的方法上使用@Transactional注释
@ApplicationScoped
公共类TestEntityRepository实现PanacherRepository{}
@Slf4j
@启动
@交易的
@适用范围
公共类测试服务{
@注入
测试报告库;
@注入
事件总线;
公共无效启动(@StartupEvent事件){
//通过事件总线的调用打印登录Listenties(),并在到达存储库调用时静默停止。
sendAndForget(“测试主题”、“事件总线调用”);
//这将打印登录listenties(),然后列出存储库中的所有实体。
听众(“直接电话”);
}
@消费事件(“测试主题”)
公共void列表实体(字符串testMessage){
log.info(“通过:“+testMessage”打印所有实体);
repository.findAll().stream().map(TestEntity::toString).forEach(log::info);
}
以下是日志中EventBus部分的摘录:

2020-10-19 21:24:39,612 INFO  [org.acm.com.TestService] (vert.x-eventloop-thread-1) Printing all entities via: eventbus call
2020-10-19 21:24:39,617 TRACE [com.arj.ats.jta] (vert.x-eventloop-thread-1) TransactionImple.setRollbackOnly
2020-10-19 21:24:39,617 TRACE [com.arj.ats.arjuna] (vert.x-eventloop-thread-1) BasicAction::preventCommit( BasicAction: 0:ffff7f000101:a721:5f8de7f7:0 status: ActionStatus.RUNNING)
2020-10-19 21:24:39,617 TRACE [com.arj.ats.jta] (vert.x-eventloop-thread-1) TransactionImple.getStatus: javax.transaction.Status.STATUS_MARKED_ROLLBACK
2020-10-19 21:24:39,618 TRACE [com.arj.ats.jta] (vert.x-eventloop-thread-1) BaseTransaction.rollback
2020-10-19 21:24:39,618 TRACE [com.arj.ats.jta] (vert.x-eventloop-thread-1) TransactionImple.rollbackAndDisassociate
2020-10-19 21:24:39,618 TRACE [com.arj.ats.arjuna] (vert.x-eventloop-thread-1) BasicAction::Abort() for action-id 0:ffff7f000101:a721:5f8de7f7:0
2020-10-19 21:24:39,618 TRACE [com.arj.ats.arjuna] (vert.x-eventloop-thread-1) BasicAction::removeChildThread () action 0:ffff7f000101:a721:5f8de7f7:0 removing 1
2020-10-19 21:24:39,618 TRACE [com.arj.ats.arjuna] (vert.x-eventloop-thread-1) BasicAction::removeChildThread () action 0:ffff7f000101:a721:5f8de7f7:0 removing 1 result = true
2020-10-19 21:24:39,618 TRACE [com.arj.ats.arjuna] (vert.x-eventloop-thread-1) TransactionReaper::remove ( BasicAction: 0:ffff7f000101:a721:5f8de7f7:0 status: ActionStatus.ABORTED )

更新

事实证明,EventBus正在吞咽有关阻塞调用的异常,并且返回像Uni一样的反应响应,甚至显式地将数据库调用包装到Uni中,仍将使用相同的线程,而不是预期的工作线程

解决方案是在事件侦听器上使用blocking=true。因此它不会设置预期的行为(如我所想),而是为阻塞调用准备事件循环

工作守则是:

@Slf4j
@启动
@适用范围
公共类测试服务{
@注入
测试报告库;
@注入
事件总线;
公共无效启动(@StartupEvent事件){
sendAndForget(“测试主题”、“事件总线调用”);
}
@ConsumeEvent(value=“test\u topic”,blocking=true)
@交易的
公共Uni列表实体(字符串testMessage){
log.info(“通过:“+testMessage”打印所有实体);
试一试{
repository.findAll().forEach(log::info);
返回Uni.createFrom().voidItem();
}捕获(例外e){
返回Uni.createFrom().failure(e);
}
}
}