概述
Actor注册提供了squbs应用一个简单的方法发送/接收消息给squbs well-known actor,特别是跨cube。这在cube之间提供了一个额外的抽象层, 允许actor在不了解其它actor的情况下找到它们。actor注册也可以作为一个门面,可以管理访问控制,安全性,跨模块的超时,甚至模拟非actor 系统作为外部actor 。
概念
- Well-known actor是在Unicomplex和Cube引导章节描述的,通过squbs-meta.conf 在cube注册的actor。
- ActorLookup API 用于发送/接收消息给well-known actor。
- ActorRegistry是一个共用的门面actor,保有所有well-known actor 信息。
Well-Known Actor
Squbs well-known actor定义在 META-INF/squbs-meta.conf 中的squbs-actors节。actor 注册继承了该注册, 并提供了进一步的元数据(描述此actor可能使用并返回消息类型)
- class-name: actor类名
- name: actor注册名
- message-class: 请求/响应消息类型
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和示例
- 发送消息 (!/?/tell/ask)给请求消息类类型注册为"TestRequest"的actor
scala
implicit val refFactory : ActorRefFactory = ...
ActorLookup ! TestRequest(...)
- 发送消息 (!/?/tell/ask)给请求消息类类型注册为"TestRequest"且响应消息类类型为"TestResponse"的actor
scala
implicit val refFactory : ActorRefFactory = ...
ActorLookup[TestResponse] ! TestRequest(...)
- 发送消息 (!/?/tell/ask)给注册名为"TestActor"且请求消息类类型为"TestRequest"的actor
scala
implicit val refFactory : ActorRefFactory = ...
ActorLookup("TestActor") ! TestRequest(...)
- 发送消息 (!/?/tell/ask)给注册名为"TestActor"、请求消息类类型为"TestRequest"且响应消息类类型为"TestResponse"的actor
scala
implicit val refFactory : ActorRefFactory = ...
ActorLookup[TestResponse]("TestActor") ! TestRequest(...)
- 解析响应消息类类型注册为"TestResponse"的actorRef
scala
implicit val refFactory : ActorRefFactory = ...
implicit val timeout : Timeout = ...
ActorLookup[TestResponse].resolveOne
- 解析注册名为"TestActor"的actorRef
scala
implicit val refFactory : ActorRefFactory = ...
implicit val timeout : Timeout = ...
ActorLookup("TestActor").resolveOne
- 解析注册名为"TestActor",响应消息类类型为"TestReponse"的actorRef
scala
implicit val refFactory : ActorRefFactory = ...
implicit val timeout : Timeout = ...
ActorLookup[TestReponse]("TestActor").resolveOne
- 解析注册名为"TestActor",请求消息类类型为"TestRequest"的actorRef
scala
implicit val refFactory : ActorRefFactory = ...
implicit val timeout : Timeout = ...
ActorLookup("TestActor").resolveOne
响应类型
通过 ActorLookup 响应类型发现 (当提供响应类型时) 发现的actor 的响应类型在查找的结果中保持。虽然程式化的响应类型对于tell 或!不太重要,但是在ask 或 ?上变得很重要。ask的返回类型通常是Future[Any]。然而ask 或 ?在ActorLookup上, 返回类型是查找到的返回类型。如果使用响应类型 T 进行查找, 您将得到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(...)
错误处理
如果想要的actor系统中不存在或未注册,不像actorSelection(将像死信发送消息),ActorLookup将返回ActorNotFound。
监控
为每一个well-known actor创建JMX Bean。它名为:
org.squbs.unicomplex:type=ActorRegistry,name=${actorPath}
依赖
为了使用actor注册,请添加如下依赖:
"org.squbs" %% "squbs-actorregistry" % squbsVersion