Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
Spring boot Axon-无法在不同的微服务中发出查询更新_Spring Boot_Microservices_Cqrs_Axon - Fatal编程技术网

Spring boot Axon-无法在不同的微服务中发出查询更新

Spring boot Axon-无法在不同的微服务中发出查询更新,spring-boot,microservices,cqrs,axon,Spring Boot,Microservices,Cqrs,Axon,当我想通过queryUpdateEmitter发出查询更新,但在不同的模块(微服务)中时,我很麻烦。我有一个基于微服务的应用程序,两者都连接到同一台Axon服务器。第一个服务创建subscriptionQuery,并发送一些命令。一段时间后(通过一些命令和事件),第二个服务处理一些事件,并为第一个订阅的查询发出更新。不幸的是,这似乎无法发送到订阅服务器。查询完全相同,并且位于相同的包中 订阅: @GetMapping("/refresh") public Mo

当我想通过queryUpdateEmitter发出查询更新,但在不同的模块(微服务)中时,我很麻烦。我有一个基于微服务的应用程序,两者都连接到同一台Axon服务器。第一个服务创建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();
    }
这种情况在最新版本的Axon中也可能发生?类似的配置,但在一个服务中按预期工作

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

  • 第二个服务不是通过queryUpdateEmitter发出查询,而是用电影列表发布事件
  • 第一个服务处理此事件,然后通过queryUpdateEmitter发出更新

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

    这源于
    queryUpdateEmitter
    的实现(无论使用Axon服务器是/否)

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

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

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

        @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()));
        }