2017-04-11 1 views
0

공용 클래스 가입자를 처리하는 가입자는 이제 두 항목이 동일한 구조 이름 (. 예 : foo는)하지만, 다른 유형이 있다고 가정 UntypedActor {Akka : 여러 주제를

public Subscriber() { 
    ActorRef mediator = 
      DistributedPubSub.get(getContext().system()).mediator(); 
    // subscribe to the topic named "content" 
    mediator.tell(new DistributedPubSubMediator.Subscribe("content", getSelf()), 
      getSelf()); 
    mediator.tell(new DistributedPubSubMediator.Subscribe("content_2", getSelf()), 
      getSelf()); 
} 

public void onReceive(Object msg) { 
    if (msg instanceof String) 
     System.out.println("Message received: " + msg); 
    else if (msg instanceof DistributedPubSubMediator.SubscribeAck) 
     System.out.println("subscribing"); 
    else 
     unhandled(msg); 
} 

}

을 확장합니다. 이 경우 가입자가 어떤 주제에서 "foo"메시지를 수신했는지 어떻게 알 수 있습니까?

답변

0

따라서 DistributedPubSub (DPS)는 액터에게 메시지를 보내는 수단 일뿐입니다. 수신 루프는 메시지가 tell, ask 또는 DPS를 통해 전송되면 메시지가받은 편지함에 있음을 알고 있습니다. DPS는받은 메시지에 대해 forward()를 호출하기 때문에 DPS에 메시지를 게시 한 사람의 보낸 사람 정보를 다시 쓰지 않습니다. 그래서 귀하의 질문에 대한 대답은 당신이 DPS가 무엇인지 알지 못한다는 것입니다. 그리고 그 문제가 아마도 설계에 문제가 있다면 생각합니다. 원래 메시지의 발신자 또는 메시지 자체의 실제 유형이 아닌 중요한 이유를 생각할 수 없습니다. 그래서 나는 타입 전환과 체크를 할 것이고 만일 타입이 어디서 왔는지 알 필요가 있다면 ActorRef의 경로에서 알 수있다.

+0

감사합니다. 그러나 답변을 완전히받지 못했습니다. 가입자가 하나 이상의 주제에 가입 할 수 있습니까? – PhiberOptixz

+0

확실히. 사실 아주 일반적입니다. 액터로 메시지를 가져 오는 추가 수단을 만듭니다. 나는 매우 큰 액터 기반 시스템을 가지고 있으며, 몇몇 배우는 여러 소스에서 생성 된 메시지를 구독하는 여러 구독을 가지고 있습니다. 저는 실제로 배우 제작자마다 주제를 제안하고 소비자들이 듣고 자하는 것을 결정하게 할 것입니다. 메시지를 처리하고 싶지 않으면 메시지를 처리되지 않은 메시지 (즉, 데드 레터)로 보내기보다는 메시지를 사용하도록하십시오. –

+0

감사합니다. 나는이 주제에 익숙하지 않다. 1) ActorRef를 주제 이름이나 나쁜 디자인으로 사용할 수 있습니까? 2) 특정 주제 이름이 이미 전체 클러스터에서 사용되는지 여부를 확인하는 방법이 있습니까? 3) 가입자가 2 개의 주제에 가입하고 있다고 가정하면 두 주제가 동일한 유형을 게시하고 있다고 가정합니다. 정보/메시지/개체에 대한 메시지를 수신하면 메시지가 어떤 주제에서 왔는지 가입자가 어떻게 알 수 있습니까? – PhiberOptixz

관련 문제