Axon-无法在其他微服务中发出查询更新

时间:2020-07-01 16:37:19

标签: spring-boot microservices cqrs axon

当我想通过queryUpdateEmitter发出查询更新但在其他模块(微服务)中时,我很烦。我有基于微服务构建的应用程序,并且两者都连接到相同的Axon Server。第一服务创建subscriptionQuery,并发送一些命令。一段时间后(通过一些命令和事件),第二个服务处理一些事件,并为第一个订阅的查询发出更新。不幸的是,这种发射似乎没有到达订户。查询完全相同,并且位于相同的程序包中。

订阅:

    @GetMapping("/refresh")
    public Mono<MovieDTO> refreshMovies() {
        commandGateway.send(
                new CreateRefreshMoviesCommand(UUID.randomUUID().toString()));

        SubscriptionQueryResult<MovieDTO, MovieDTO> refreshedMoviesSubscription =
                queryGateway.subscriptionQuery(
                        new GetRefreshedMoviesQuery(),
                        ResponseTypes.instanceOf(MovieDTO.class),
                        ResponseTypes.instanceOf(MovieDTO.class)
                );

        return refreshedMoviesSubscription.updates().next();
    }

发射器:

    @EventHandler
    public void handle(DataRefreshedEvent event) {
        log.info("[event-handler] Handling {}, movieId={}",
                event.getClass().getSimpleName(),
                event.getMovieId());
                queryUpdateEmitter.emit(GetRefreshedMoviesQuery.class, query -> true,
                        Arrays.asList(
                                MovieDTO.builder().aggregateId("as").build(),
                                MovieDTO.builder().aggregateId("be").build()));
    }

在最新版本的Axon中甚至可能出现这种情况?类似的配置,但一项服务中的配置按预期工作。

@编辑 我已经找到了解决这种情况的方法:

  1. 第二项服务而不是通过queryUpdateEmitter发出查询,而是发布带有电影列表的事件
  2. 第一个服务处理此事件,然后通过queryUpdateEmitter发出更新

但是我仍然想知道是否有一种方法可以仅使用查询来执行此操作,因为这对我来说似乎很自然(commandGateways / eventGateways可以按预期工作,queryUpdateEmitter除外)。

1 个答案:

答案 0 :(得分:1)

这是从QueryUpdateEmitter的实现开始的(无论是否使用Axon Server是/否)。

QueryUpdateEmitter存储一组更新处理程序,引用已发布的订阅查询。但是,它仅维护由给定JVM处理的已发出的预订查询(因为QueryUpdateEmitter实现未分发)。

其目的是在组件(通常是查询模型“投影仪”)中配对,该组件回答有关给定模型的查询,更新模型 并发出这些更新。

因此,将QueryUpdateEmitter操作放在处理查询的其他(微)服务中将不起作用。