首页 > 解决方案 > Axon - 如何获取 @QueryHandler 句柄方法以返回 Optional

问题描述

笔记:

这个问题的重点不仅仅是取回我最终想要的值。
我可以通过简单地不使用来做到这一点Optional。我想要一个优雅的解决方案,这样我就可以开始返回 Optional。

我试图做的解释:

我使用了QueryGateway一个签名来查询我的处理程序。我打破了我的代码,因此您可以在我的代码中看到CompletableFuture我将执行阻塞获取以检索Optional包含我真正想要的对象的内容。 请注意,我不是在寻找包含我的可选课程的课程。如果这不优雅,那么我不妨做我的空检查。

对查询的调用有效,但出现以下错误:

org.axonframework.axonserver.connector.query.AxonServerQueryDispatchException: CANCELLED: HTTP/2 error code: CANCEL
    Received Rst Stream  
    AXONIQ-5002
    58484@DESKTOP-CK6HLMM

启动查询的代码示例:

UserProfileOptionByUserQuery q = new UserProfileOptionByUserQuery(userId);    
CompletableFuture<Optional<UserProfile>> query = 
  queryGateway.query(q,ResponseTypes.optionalInstanceOf(UserProfile.class));
Optional<UserProfile> optional = query.get();

query.get()调用时发生错误。

我的查询处理程序示例:

@QueryHandler
Optional<UserProfile> handle(UserProfileOptionByUserQuery query, @MetaDataValue(USER_INFO) UserInfo userInfo) {
    assertUserCanQuery(query, userInfo);
    return userProfileRepository.findById(query.getUserId());
}

查询处理程序工作正常。其他努力(例如使用OptionalResponseType)不会根据需要启动我的查询。

标签: axon

解决方案


我认为关键在于您收到斯蒂芬的例外情况。

为了我自己的利益,我在Optional查询处理方面测试了以下排列:

  1. Query Handler 返回Optional,Query Dispatcher 使用OptionalResponeType
  2. Query Handler 返回MyType,Query Dispatcher 使用OptionalResponeType
  3. Query Handler 返回Optional,Query Dispatcher 使用InstanceResponeType

补充说,我已经用 Axon Server 和 Axon Server 尝试了这些排列SimpleQueryBus。所有三个选项的两辆公共汽车对我来说都很好。

这向我建议您应该深入了解AxonServerQueryDispatchException您收到的内容。因此,我将为您提供几个后续问题,以进一步推断问题所在。我建议用对他们的回复来更新你原来的问题。

您是否有机会获得更详细的堆栈跟踪?而且,您使用的是什么版本的 Axon Framework 和 Axon Server?你是标准版吗?企业版?这种行为是否只发生在Optional您与我们共享的这个确切的查询处理程序中?


推荐阅读