概述
Actor注冊(cè)提供了squbs應(yīng)用一個(gè)簡(jiǎn)單的方法發(fā)送/接收消息給squbs well-known actor抡四,特別是跨cube。這在cube之間提供了一個(gè)額外的抽象層, 允許actor在不了解其它actor的情況下找到它們恨闪。actor注冊(cè)也可以作為一個(gè)門面,可以管理訪問控制,安全性帚湘,跨模塊的超時(shí),甚至模擬非actor 系統(tǒng)作為外部actor 甚淡。
概念
- Well-known actor是在Unicomplex和Cube引導(dǎo)章節(jié)描述的大诸,通過squbs-meta.conf 在cube注冊(cè)的actor。
- ActorLookup API 用于發(fā)送/接收消息給well-known actor。
- ActorRegistry是一個(gè)共用的門面actor资柔,保有所有well-known actor 信息焙贷。
Well-Known Actor
Squbs well-known actor定義在 META-INF/squbs-meta.conf 中的squbs-actors節(jié)。actor 注冊(cè)繼承了該注冊(cè), 并提供了進(jìn)一步的元數(shù)據(jù)(描述此actor可能使用并返回消息類型)
- class-name: actor類名
- name: actor注冊(cè)名
- message-class: 請(qǐng)求/響應(yīng)消息類型
cube-name = org.squbs.TestCube
cube-version = "0.0.5"
squbs-actors = [
{
class-name = org.squbs.testcube.TestActor
name = TestActor
message-class = [
{
request = org.squbs.testcube.TestRequest
response= org.squbs.testcube.TestResponse
}
{
request = org.squbs.testcube.TestRequest1
response= org.squbs.testcube.TestResponse1
}
]
}
]
Scala API和示例
- 發(fā)送消息 (!/?/tell/ask)給請(qǐng)求消息類類型注冊(cè)為"TestRequest"的actor
scala
implicit val refFactory : ActorRefFactory = ...
ActorLookup ! TestRequest(...)
- 發(fā)送消息 (!/?/tell/ask)給請(qǐng)求消息類類型注冊(cè)為"TestRequest"且響應(yīng)消息類類型為"TestResponse"的actor
scala
implicit val refFactory : ActorRefFactory = ...
ActorLookup[TestResponse] ! TestRequest(...)
- 發(fā)送消息 (!/?/tell/ask)給注冊(cè)名為"TestActor"且請(qǐng)求消息類類型為"TestRequest"的actor
scala
implicit val refFactory : ActorRefFactory = ...
ActorLookup("TestActor") ! TestRequest(...)
- 發(fā)送消息 (!/?/tell/ask)給注冊(cè)名為"TestActor"贿堰、請(qǐng)求消息類類型為"TestRequest"且響應(yīng)消息類類型為"TestResponse"的actor
scala
implicit val refFactory : ActorRefFactory = ...
ActorLookup[TestResponse]("TestActor") ! TestRequest(...)
- 解析響應(yīng)消息類類型注冊(cè)為"TestResponse"的actorRef
scala
implicit val refFactory : ActorRefFactory = ...
implicit val timeout : Timeout = ...
ActorLookup[TestResponse].resolveOne
- 解析注冊(cè)名為"TestActor"的actorRef
scala
implicit val refFactory : ActorRefFactory = ...
implicit val timeout : Timeout = ...
ActorLookup("TestActor").resolveOne
- 解析注冊(cè)名為"TestActor"辙芍,響應(yīng)消息類類型為"TestReponse"的actorRef
scala
implicit val refFactory : ActorRefFactory = ...
implicit val timeout : Timeout = ...
ActorLookup[TestReponse]("TestActor").resolveOne
- 解析注冊(cè)名為"TestActor",請(qǐng)求消息類類型為"TestRequest"的actorRef
scala
implicit val refFactory : ActorRefFactory = ...
implicit val timeout : Timeout = ...
ActorLookup("TestActor").resolveOne
響應(yīng)類型
通過 ActorLookup 響應(yīng)類型發(fā)現(xiàn) (當(dāng)提供響應(yīng)類型時(shí)) 發(fā)現(xiàn)的actor 的響應(yīng)類型在查找的結(jié)果中保持羹与。雖然程式化的響應(yīng)類型對(duì)于tell 或!不太重要沸手,但是在ask 或 ?上變得很重要。ask的返回類型通常是Future[Any]注簿。然而ask 或 ?在ActorLookup上契吉, 返回類型是查找到的返回類型。如果使用響應(yīng)類型 T 進(jìn)行查找, 您將得到Future[T]如下所示诡渴。
// In this example, we show full type annotation. The Scala compiler is able
// to infer the type if you just pass one side, i.e. the type parameter at
// ActorLookup, or the type annotation on the val f declaration.
val f: Future[TestResponse] = ActorLookup[TestResponse] ? TestRequest(...)
錯(cuò)誤處理
如果想要的actor系統(tǒng)中不存在或未注冊(cè)捐晶,不像actorSelection(將像死信發(fā)送消息),ActorLookup將返回ActorNotFound妄辩。
監(jiān)控
為每一個(gè)well-known actor創(chuàng)建JMX Bean惑灵。它名為:
org.squbs.unicomplex:type=ActorRegistry,name=${actorPath}
依賴
為了使用actor注冊(cè),請(qǐng)?zhí)砑尤缦乱蕾嚕?/p>
"org.squbs" %% "squbs-actorregistry" % squbsVersion