Java 是否可以使用以前的状态更新订阅消息?

Java 是否可以使用以前的状态更新订阅消息?,java,kotlin,axon,Java,Kotlin,Axon,假设我有这样的订阅查询: queryGateway.subscriptionQuery( FetchListOfBookQuery, ResponseType.multipleInstancesOf(Book::class.java), multipleInstancesOf(Book::class.java) ) 所以,它将订阅databsae中的图书列表,若我想添加一本新书,我的投影中会有这样的内容: fun on(活动:bookaddevent){ var book=repo.save(

假设我有这样的订阅查询:

queryGateway.subscriptionQuery(
FetchListOfBookQuery,
ResponseType.multipleInstancesOf(Book::class.java),
multipleInstancesOf(Book::class.java)
)
所以,它将订阅databsae中的
图书列表,若我想添加一本新书,我的投影中会有这样的内容:

fun on(活动:bookaddevent){
var book=repo.save(book(event.bookId)).block()
queryUpdateEmitter.emit(
FetchListOfBookQuery::class.java,
{it.bookId==book.bookId},
书
)
}

问题是,因为我只得到了一个新添加的
书籍
的实例,为了更新订阅查询,我还需要有以前的
书籍
列表。有没有办法获取订阅查询的先前更新状态,比较更改并最终更新它?

Axon Framework提供的订阅查询逻辑允许您检索初始响应和更新。在代码中,这将转换为首先命中
@QueryHandler
注释的方法,然后通过
QueryUpdateEmitter
发出更新

发射什么完全取决于你。因此,如果您决定将新添加的
书籍
与之前的所有
书籍
一起发送,则完全可以。不过,您可能已经注意到,
QueryUpdateEmitter
不会存储更新本身,查询端的
SubscriptionQueryResult
也不会存储更新

因此,如果您需要逻辑来过滤掉以前的更新发送的内容,那么您必须自己构建它。为此,你可以选择构建一个专用的逻辑,也许是一个服务来完成这项工作。或者,您可以创建自己的
QueryUpdateEmitter
,以增强简化发送更新的行为

我认为后者是最干净的方法,为此我建议包装
SimpleQueryUpdateMitter
。然而,这可能是一些定制代码,因此我首先要检查是否有一种不同的方式来满足您的要求:

。。。但是为了更新订阅查询,我需要有以前的书籍列表

如果你真的是迫不得已地走上了这条路,我很想看到结果,或者可能会在这件事上提供一些建议

这是我的两分钱,希望这能帮到你@Patrick