1 回答

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