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