Query Handling
查詢處理組件主要是對傳入的查詢消息作處理。查詢處理組件作用于傳入的查詢消息。他們通常從Event listeners創(chuàng)建的視圖模型中讀取數(shù)據(jù)。查詢處理組件通常不會引發(fā)新事件或發(fā)送Command。
Defining Query Handlers
在Axon框架中,一個對象可以通過@QueryHandler注解定義多個Query Handler方法。
默認(rèn)情況下,@QueryHandler注解的方法支持以下參數(shù):
- 第一個參數(shù)總是查詢消息(Query Message)的payload。如果@QueryHandler注解顯示的指定了Query handler能處理的查詢的名稱,那么他可以是Message或QueryMessage類型。默認(rèn)情況下,Query名稱是查詢payload的全類名。
- 用@MetaDataValue注解的參數(shù),將用注解上的鍵對元數(shù)據(jù)值進(jìn)行解析。如果這個值是false(默認(rèn)),則當(dāng)元數(shù)據(jù)值不存在時會傳遞null。如果值是true,而元數(shù)據(jù)值不存時,這時解析器會發(fā)現(xiàn)錯誤,并阻止該方法的調(diào)用。
- 參數(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)用方法:
- 在類層次結(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);