2017-04-11 63 views
0

公共类用户扩展UntypedActor {阿卡:用户处理多主题

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

谢谢,但我没有完全得到你的答案。订阅者是否可以订阅超过1个主题? – PhiberOptixz

+0

绝对是的。事实上很常见。只需创建额外的手段将消息传入演员。我有一个非常大的基于演员的系统,并且一些演员有几个订阅来订阅由几个来源产生的消息。事实上,我会为每个演员制作一个话题,让消费者决定他们想听什么。只要确保如果你不想处理你使用它们的消息,而不是将它们发送给未经删除的(因此是死信)。 –

+0

谢谢。我是这个主题的新东西。 1)我可以使用ActorRef作为主题名称还是其糟糕的设计? 2)是否有办法知道特定主题名称是否已在整个集群中使用3)假设(我曾问过的原始问题)订阅者订阅了2个主题&让我们假设两个主题都发布相同类型的信息/消息/对象,现在订阅者将如何知道该消息来自哪个主题。 – PhiberOptixz