Quarkus 1.8.3。最终的
直接调用访问PanacherRepository的方法可以按预期工作,但是当通过EventBus调用同一方法时,调用到达该方法并执行每一行,直到它到达任何存储库调用,然后在没有任何发生的指示的情况下无声地失败/退出。
根据日志,直接调用在Quarkus主线程中执行,事件总线调用在vert中执行。x-eventloop-thread-2。
还尝试了以下步骤的组合,结果相同:
@ApplicationScoped
public class TestEntityRepository implements PanacheRepository<TestEntity> { }
@Slf4j
@Startup
@Transactional
@ApplicationScoped
public class TestService {
@Inject
TestEntityRepository repository;
@Inject
EventBus eventBus;
public void startUp(@Observes StartupEvent event) {
// Call via the event bus prints the log in listEntities() and silently stops when it reaches the repository call.
eventBus.sendAndForget("test_topic", "eventbus call");
// This prints the log in listEntities() and then lists all the entities in the repository.
listEntities("direct call");
}
@ConsumeEvent("test_topic")
public void listEntities(String testMessage) {
log.info("Printing all entities via: " + 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 )
更新:bugreport已创建
事实证明,EventBus正在吞咽关于阻塞调用的异常,并且返回一个像Uni一样的反应响应,甚至显式地将数据库调用包装到Uni中,仍将使用相同的线程,而不是预期的工作线程。
解决方案是在事件侦听器上使用blocking=true。因此,它没有设置预期的行为(如我所想),而是为阻塞调用准备事件循环。。
工作守则是:
@Slf4j
@Startup
@ApplicationScoped
public class TestService {
@Inject
TestEntityRepository repository;
@Inject
EventBus eventBus;
public void startUp(@Observes StartupEvent event) {
eventBus.sendAndForget("test_topic", "eventbus call");
}
@ConsumeEvent(value = "test_topic", blocking = true)
@Transactional
public Uni<Void> listEntities(String testMessage) {
log.info("Printing all entities via: " + testMessage);
try {
repository.findAll().forEach(log::info);
return Uni.createFrom().voidItem();
} catch (Exception e) {
return Uni.createFrom().failure(e);
}
}
}
我有一个JAVA类,它被视为托管bean。下面的代码是它的精简版本: 对recycleObjects(someObject)的调用在从JAVA代码调用时运行良好,但是当我在XPage上的一个名为TestError的按钮中从SSJS调用它时,我得到的消息是“State data not available for/TestError,因为在缓存中没有找到控件树。”按钮中的SSJS代码是: 其中WFS
作为Springboot的新手,我看到了一个例子,我们创建存储库来对给定的Object执行各种操作。这是样品一 所以从其他客户那里,如果我派人杰森 http://localhost:8080/people{....} 它插入到数据库中,在内部调用 save 方法。 在这里,从REST客户端调用后,我想进行一些验证或业务登录,然后插入到数据库,我该怎么做?这意味着我想调用一个服务方法来完成所有的业务
Powermock为什么不模拟静态方法调用,而是在然后()语句中调用初始方法? 在这种情况下,我有一系列方法调用: TestClass方法-调用- Class4方法尝试查找上下文中不存在且挂起的对象,因此我尝试使用Powermock模拟公共静态Class3方法。 所有的类和方法都是非最终的。我使用TestNg。我的测试方法有一个@准备测试我尝试了以下方法来模拟方法调用: 或而不是当-然后返回: 或
问题内容: 我有下表: 现在,我需要一个mysql中的存储过程,该存储过程以递归方式调用自身并返回计算出的数量。例如,id 6有5个父级,而3个父级又有2个父级。因此,我需要计算(= 240)作为结果。 我对存储过程还很陌生,将来我不会经常使用它们,因为我更喜欢在程序代码中而不是在数据库中使用业务逻辑。但是在这种情况下,我无法避免。 也许mysql专家(就是您)可以在几秒钟内破解一条工作语句。 问
我正在尝试访问Sentinel2公共数据,如下所述:https://cloud.google.com/storage/docs/public-datasets 该文件说:“相比之下,使用云存储API链接访问公共数据不需要身份验证。” 然而,我收到了以下错误:“com.google.cloud.storage.存储异常:匿名调用者storage.objects.get访问谷歌云存储对象。”我正在使用
我在启动服务时遇到以下异常 ...org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“level detailsservice”的bean时出错:通过字段“store repo”表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.BeanCreationExce