[翻译]squbs官网之16 Actor注册

概述

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容