axon-查詢處理

Query Handling

查詢處理組件主要是對傳入的查詢消息作處理。查詢處理組件作用于傳入的查詢消息。他們通常從Event listeners創(chuàng)建的視圖模型中讀取數(shù)據(jù)。查詢處理組件通常不會引發(fā)新事件或發(fā)送Command。

Defining Query Handlers

在Axon框架中,一個對象可以通過@QueryHandler注解定義多個Query Handler方法。

默認(rèn)情況下,@QueryHandler注解的方法支持以下參數(shù):

  1. 第一個參數(shù)總是查詢消息(Query Message)的payload。如果@QueryHandler注解顯示的指定了Query handler能處理的查詢的名稱,那么他可以是Message或QueryMessage類型。默認(rèn)情況下,Query名稱是查詢payload的全類名。
  2. 用@MetaDataValue注解的參數(shù),將用注解上的鍵對元數(shù)據(jù)值進(jìn)行解析。如果這個值是false(默認(rèn)),則當(dāng)元數(shù)據(jù)值不存在時會傳遞null。如果值是true,而元數(shù)據(jù)值不存時,這時解析器會發(fā)現(xiàn)錯誤,并阻止該方法的調(diào)用。
  3. 參數(shù)為MetaData的話,那么將注入一個EventMessage的整個MetaData
    4.如果參數(shù)是UnitOfWork的話,那么將獲取當(dāng)前的UnitOfWork并注入進(jìn)來。它允許查詢處理程序注冊要在工作單元的某個階段執(zhí)行的操作,或者獲取對其注冊的資源的訪問權(quán)限。
    5.如果參數(shù)是Message或者 QueryMessage 的話,他們會獲取整個的數(shù)據(jù),它們包括Meta Data元數(shù)據(jù)和payload.如果一個方法需要多個元數(shù)據(jù)字段,或者包裝消息的其他屬性,這很有用處。

您可以通過實現(xiàn)ParameterResolverFactory接口并創(chuàng)建一個名為/META-INF/service/org.axonframework.common.annotation.ParameterResolverFactory的文件來配置其他ParameterResolver,該文件包含實現(xiàn)類的全名。詳情請 參考Advanced Customizations 。

在所有情況下,每個query handler實例最多調(diào)用一個事件處理程序方法。 Axon將使用以下規(guī)則搜索最匹配的調(diào)用方法:

  1. 在類層次結(jié)構(gòu)(注:類的繼承關(guān)系)的實際實例層次(由this.getClass()返回)中,將評估所有注解的方法
    2.如果找到一個或多個方法可以將所有參數(shù)解析為一個值,則選擇并調(diào)用最匹配(注:像java的多繼承接口同時繼承一個類的同一個方法調(diào)用沖突,也就是子接口或者實現(xiàn)優(yōu)先)的類型的方法
    3.如果在這個級別的類層次結(jié)構(gòu)中沒有找到方法,那么超類的評估方法是相同的
    4.當(dāng)達(dá)到類層次結(jié)構(gòu)的頂層時,還沒有找到合適的query handler,該事件就被忽略掉。

// assume QueryB extends QueryA // and QueryC extends QueryB// and a single instance of SubHandler is registered
public class TopHandler {

@QueryHandler
public MyResult handle(QueryA query) {
}

@QueryHandler
public MyResult handle(QueryB query) {
}

@QueryHandler
public MyResult handle(QueryC query) {
}

}
public class SubHandler extends TopHandler {

@QueryHandler
public MyResult handleEx(QueryB query) {
}

}
在上面的例子中,將調(diào)用SubHandler的處理方法來查詢QueryB和結(jié)果MyResult;調(diào)用TopHandler的處理程序方法來查詢QueryA和QueryC,并得到MyResult。

注冊查詢處理

可以為相同的查詢名稱和響應(yīng)類型注冊多個查詢處理程序。當(dāng)分發(fā)查詢時,客戶端可以指示他是想要來一個還是來自所有的查詢處理程序的結(jié)果。

配合spring使用

當(dāng)使用Spring AutoConfiguration時,所有的singleton Spring bean都會被掃描以獲得具有@QueryHandler注解的方法。對于找到的每個方法,都會在查詢總線上注冊一個新的查詢處理程序。

使用API配置

也可以使用API配置來注冊查詢處理程序。為此,請使用Configurer類上的registerQueryHandler方法:

// Sample query handlerpublic class MyQueryHandler {
@QueryHandler
public String echo(String echo) {
return echo;
}
}

...
// To register your query handler
Configurer axonConfigurer = DefaultConfigurer.defaultConfiguration()
.registerQueryHandler(conf -> new MyQueryHandler);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,677評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,267評論 25 708
  • 一直都以為可以不用長大,時間匆忙,我們卻成了大人;以前的無憂無慮,無拘無束都結(jié)束了。我以為我可以像大地一樣,可以接...
    易簡易峰閱讀 226評論 3 0
  • 我曾困惑于如何把自己的觀念傳遞給孩子,是講道理嗎?他往往口頭答應(yīng)得好好的,轉(zhuǎn)瞬就忘了;是打感情牌嗎?你看媽媽多辛苦...
    胡喜平閱讀 445評論 0 1
  • 無常 漢語語境里面,無常指人命運的云譎波詭,無處琢磨亦無常態(tài),總是用意想不到的方式來敲響每個人的門。人們對無常的恐...
    木月踏歌閱讀 613評論 0 0

友情鏈接更多精彩內(nèi)容