actor注冊(cè)表
概覽
actor注冊(cè)表提供了squbs應(yīng)用一個(gè)簡(jiǎn)單的方式發(fā)送/接收消息至squbs well-known actor,尤其在跨cube方面。它提供了一個(gè)附加的抽象層來(lái)跨cube,在不需要了解其他actor太多的情況下,允許actor發(fā)現(xiàn)其他actor。actor注冊(cè)表同時(shí)扮演一個(gè)蒙面來(lái)管理訪問(wèn)控制、安全、跨模塊超時(shí)甚至模擬外部actor的non-actor系統(tǒng)。
概念
- Well-known actor是通過(guò)
squbs-meta.conf
定義注冊(cè)的actor,在Unicomplex & Cube Bootstrapping有描述
*ActorLookup
API(Scala)和japi.ActorLookup
API(Java)用在發(fā)送接收消息至well-known actor -
ActorRegistry
是通用的門面actor來(lái)保持所有的well-known actor的信息。
Well-Known Actor
Squbs well-known actor定義在Unicomplex & Cube Bootstrapping文檔中的 META-INF/squbs-meta.conf
配置文件中的squbs-actors部分。actor 注冊(cè)表擴(kuò)展諸惡并提供更多關(guān)于消息元數(shù)據(jù)類型,這個(gè)消息可能消費(fèi)和返回:
- class-name: actor的類名
- name: 已注冊(cè)的actor的名稱
- message-class: 請(qǐng)求/響應(yīng)消息類型
通過(guò)擴(kuò)展類型信息注冊(cè)的例子:
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 & Samples
-
發(fā)送消息 (!/?/tell/ask)至注冊(cè)消息類型為"TestRequest"的actor
implicit val refFactory : ActorRefFactory = ... ActorLookup ! TestRequest(...)
-
發(fā)送消息至注冊(cè)請(qǐng)求類型為 "TestRequest"的actor,并且返回類型為"TestResponse"。
implicit val refFactory : ActorRefFactory = ... ActorLookup[TestResponse] ! TestRequest(...)
-
發(fā)送消息 (!/?/tell/ask)至注冊(cè)名為"TestActor"的actor,并且請(qǐng)求消息類型為"TestRequest"
implicit val refFactory : ActorRefFactory = ... ActorLookup("TestActor") ! TestRequest(...)
-
發(fā)送消息(!/?/tell/ask)至注冊(cè)名為 "TestActor",請(qǐng)求類型為"TestRequest",響應(yīng)類型為"TestResponse"的消息
implicit val refFactory : ActorRefFactory = ... ActorLookup[TestResponse]("TestActor") ! TestRequest(...)
-
處理注冊(cè)請(qǐng)求消息類型為"TestResponse"的actorRef
implicit val refFactory : ActorRefFactory = ... implicit val timeout : Timeout = ... ActorLookup[TestResponse].resolveOne
-
處理注冊(cè)請(qǐng)求消息名為"TestActor",響應(yīng)類型為"TestResponse"的actorRef
implicit val refFactory : ActorRefFactory = ... implicit val timeout : Timeout = ... ActorLookup[TestReponse]("TestActor").resolveOne
-
處理注冊(cè)請(qǐng)求消息名為"TestActor",請(qǐng)求類型為"TestResponse"的TestRequest
implicit val refFactory : ActorRefFactory = ... implicit val timeout : Timeout = ... val al= new ActorLookup(requestClass=Some(classOf[TestRequest])) al.resolveOne
Java API和例子
-
創(chuàng)建你的ActorLookup
// Pass in context() from and Actor or the ActorSystem private ActorLookup<?> lookup = ActorLookup.create(context());
-
發(fā)送消息(tell/ask)至請(qǐng)求類型為"TestRequest"的actor
lookup.tell(new TestRequest(...), self());
-
發(fā)送消息 (tell/ask) 至請(qǐng)求類型為"TestRequest"的消息,類型為"TestResponse"的響應(yīng)消息的actor。
lookup.lookup(TestResponse.class).tell(new TestRequest(...), self())
-
發(fā)送消息 (tell/ask) 至注冊(cè)名為"TestActor"的actor,請(qǐng)求消息類型為"TestRequest"
lookup.lookup("TestActor").tell(new TestRequest(...), self())
-
發(fā)送消息 (tell/ask) 至注冊(cè)名為"TestActor"的actor,請(qǐng)求消息類型為"TestRequest",響應(yīng)消息類型為"TestResponse"
lookup.lookup("TestActor", TestResponse.class).tell(new TestRequest(...), self())
-
處理響應(yīng)類型為"TestResponse"的actorRef
lookup.lookup(TestResponse.class).resolveOne(timeout)
-
處理名稱為"TestActor" 的actorRef
lookup.lookup("TestActor").resolveOne(timeout)
-
處理名稱為"TestActor" 的actorRef ,且響應(yīng)類型為"TestReponse"
lookup.lookup("TestActor", TestResponse.class).resolveOne(timeout)
-
處理名稱為"TestActor" 的actorRef ,且請(qǐng)求消息類型為"TestRequest" 。這使用optional字段類型 Optional<T>全查找標(biāo)記。所以名稱和請(qǐng)求類需要包裹為
Optional
或傳遞 Optional.empty() 如果不是查詢額一部分。響應(yīng)請(qǐng)求類型始終需要。如果接受任意類型,設(shè)置響應(yīng)類型設(shè)置Object.class
使得任何繼承于java.lang.Object
的子類是有效的。lookup.lookup(Optional.of("TestActor"), Optional.of(TestRequest.class), Object.class)
響應(yīng)類型
actor的響應(yīng)類型被ActorLookup發(fā)現(xiàn),響應(yīng)類型發(fā)現(xiàn)保持跨結(jié)果lookup(當(dāng)響應(yīng)類型提供時(shí))。編程響應(yīng)類型在 tell
或 !
不太重要,然而他在ask
或 ?
很重要。 ask
的返回類型通常是Future[Any]
(Scala)或Future<Object>
(Java)。然而在查找時(shí),基于ActorLookup上的ask
或?
的返回類型提供響應(yīng)類型。所以,你將獲得 Future[T]
或 Future<T>
如果你通過(guò)響應(yīng)類型T
查找,可以在下面的演示中展現(xiàn)。不需要更多的映射:
Scala
// 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(...)
Java
Future<TestResponse> f = lookup.lookup(TestResponse.class).ask(new TestRequest(...), timeout)
錯(cuò)誤處理
不像actorSelection
會(huì)發(fā)送消息至死信,如果我們想要的actor不在系統(tǒng)中或者未注冊(cè),ActorLookup會(huì)返回ActorNotFound
響應(yīng)。
Monitoring
每個(gè)well-known actor創(chuàng)建了 JMX Bean。它名叫org.squbs.unicomplex:type=ActorRegistry,name=${actorPath}
依賴
使用actor注冊(cè)表,添加以下的依賴至你的build.sbt或scala構(gòu)建文件
"org.squbs" %% "squbs-actorregistry" % squbsVersion