如何使用Axon框架获取所有聚合?

如何使用Axon框架获取所有聚合?,axon,Axon,我从Axon框架开始,遇到了一些障碍 虽然我可以使用聚合ID加载单个聚合,但我不知道如何获取所有聚合的列表,或者所有聚合ID的列表 EventSourcingRepository类只有返回一个聚合的load()方法 是否有一种方法来收集所有的聚合ID(ID),或者我应该在axon之外保留一个所有聚合ID的列表 为了简单起见,我现在只在MemoryEventsStorage Engine中使用。 我正在使用Axon 3.0.7。首先,我想知道您为什么要从存储库中检索所有聚合的完整列表。 设置存储库

我从Axon框架开始,遇到了一些障碍

虽然我可以使用聚合ID加载单个聚合,但我不知道如何获取所有聚合的列表,或者所有聚合ID的列表

EventSourcingRepository
类只有返回一个聚合的
load()
方法

是否有一种方法来收集所有的聚合ID(ID),或者我应该在axon之外保留一个所有聚合ID的列表

为了简单起见,我现在只在MemoryEventsStorage Engine中使用

我正在使用Axon 3.0.7。

首先,我想知道您为什么要从
存储库中检索所有聚合的完整列表。
设置
存储库
界面,以便您可以加载
聚合
,以处理命令或创建新的
聚合

问你这个问题,我几乎猜你是在用它来查询而不是命令处理。 但是,这不是
EventSourcingRepository
的预期用途

我可以考虑的一个原因是,您希望实现一个API调用,将命令发布到应用程序中特定类型的所有
聚合。
在这种情况下,是的,您需要自己存储aggregateId引用

但以我前面的问题作为结束:为什么要通过
存储库
界面检索聚合列表

答案更新

关于你的评论,我在回答中补充了以下内容:

Axon帮助您在设置应用程序时考虑到事件源,但也考虑到CQR(命令查询责任分离)。 因此,这意味着应用程序的命令端和查询端被分开

聚合
存储库
是应用程序的命令端,您可以在其中请求执行操作。 因此,它不提供聚合列表,因为命令是对聚合的意图表达。因此,它只需要
存储库
用户检索或创建一个聚合

您需要的聚合列表示例是应用程序的查询端。 查询端(视图/实体)通常根据事件(通过事件来源)进行更新。 对于应用程序中的任何
查询需求,您通常会引入一个根据需要定制的单独视图


在您的示例中,这意味着您将引入一个事件处理组件,监听聚合事件,该组件使用聚合的查询模型更新存储库。

传递到
EventSourcingRepository
EventStore
实现了
streamablemessagesource感谢您的回答。一般来说,我对Axon和事件来源都是新手,所以我对它们的看法不太可能是“错误的”。我不一定要通过
存储库
界面检索聚合列表。这正是我所期望的。我需要一个聚合列表,以便能够在UI中选择它们,然后编辑每个聚合。我也这么认为,因此我给出了答案:)Axon可以帮助您在设置应用程序时考虑到事件源,同时也考虑到CQR。因此,这意味着应用程序的命令端和查询端被分开。聚合
存储库
是应用程序的命令端,您可以在其中请求执行操作。但是,聚合列表的需要是应用程序的查询端,它会根据事件进行更新。所以,对于任何UI视图,通常都会有一个单独的存储库,在您的示例中是一个聚合列表。
    List<String> aggregates(StreamableMessageSource<Message<?>> eventStore) {
        return immediatelyAvailableStream(eventStore.openStream(
                eventStore.createTailToken() /* All events in the event store */
        ))
                .filter(e -> e instanceof DomainEventMessage)
                .map(e -> (DomainEventMessage) e)
                .map(DomainEventMessage::getAggregateIdentifier)
                .distinct()
                .collect(Collectors.toList());
    }

    /*
        Note that the stream returned by BlockingStream.asStream() will block / won't terminate
        as it waits for future elements.
     */
    static <M> Stream<M> immediatelyAvailableStream(final BlockingStream<M> messageStream) {
        Iterator<M> iterator = new Iterator<M>() {
            @Override
            public boolean hasNext() {
                return messageStream.hasNextAvailable();
            }

            @Override
            public M next() {
                try {
                    return messageStream.nextAvailable();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    throw new IllegalStateException("Didn't expect to be interrupted");
                }
            }
        };

        Spliterator<M> spliterator = Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED);
        Stream stream = StreamSupport.stream(spliterator, false);
        return (Stream)stream.onClose(messageStream::close);
    }