squbs-14. Actor注冊(cè)表

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容