1 回答

TA貢獻1829條經驗 獲得超7個贊
對此的簡短回答是,沒有簡單/快速的方法可以做到這一點。
但是,實施“在請求時重播給定事件”設置肯定是可行的。
我建議你做的事情分為幾個步驟:
創建你想返回的查詢模型,它可以處理事件(
@EventHandler
在模型上使用帶注釋的方法)創建一個組件,它可以處理將在第一步中返回查詢模型的查詢(為此使用帶
@QueryHandler
注釋的方法。查詢處理組件應該能夠從
EventStore
. 如果這是基于aggregateIdentifier
,請使用該EventStore#readEvents(String)
方法。如果需要整個事件流,需要使用StreamableMessageSource#openStream(TrackingToken)
方法(注:EventStore
接口實現StreamableMessageSource
)在處理查詢時,創建一個
AnnotationEventHandlerAdapter
,給它一個新的查詢模型實例對于您在第 3 點中創建的事件流中的每個事件,調用該
AnnotationEventHandlerAdapter#handle(EventMessage)
方法。此方法將@EventHandler
在您的查詢模型對象上調用帶注釋的方法如果流耗盡,您可以確保您的查詢模型的所有必要事件都已處理。因此,您現在可以返回查詢模型
因此,我再次重申,我不認為這過于瑣碎、容易或快速設置。此外,第 3 步中有一個警告?;诰酆蠘俗R符檢索給定聚合的流非??焖?簡潔,因為聚合通常沒有很多事件。
但是,如果您的查詢模型跨越多個聚合,則需要基于 a 檢索事件流TrackingToken
,這可以確保您拉入整個事件存儲以動態實例化您的模型。當然,您可以在處理 a 時微調您希望事件流從中返回事件的時間點TrackingToken
,但是更改非常高,您將不完整且相對較慢。
但是,您聲明要檢索給定聚合標識符的事件。因此,我認為這在您的場景中應該是一個可行的解決方案。
希望這可以幫助!
添加回答
舉報