2017-03-19 8 views
1

나는 응용 프로그램 시작시 액터 개념이나 아무것도 가지지 않는 메시지 큐를 가지고 있습니다. 큐로부터 메시지를 계속 수신 할 메시지 큐 소비자를 시작하고 싶습니다. 이제 Play 프레임 워크는 모든 웹 소켓 연결에 대해 액터를 만들고 특정 웹 엔드 포인트에 대한 웹 소켓 연결을 유지하는 모든 액터를 그룹화하여 특정 메시지 대기열에서받은 모든 메시지를 브로드 캐스팅 할 수 있기를 원합니다. 주제를 배우들의 그룹에게 제공합니다.Play Framework를 사용하여 특정 웹 소켓 종점에서 액터 목록을 얻는 방법은 무엇입니까?

예를 들어 다음 엔드 포인트는 클라이언트가 아래 엔드 포인트 중 하나에 대한 요청을 시작할 때마다 생성되는 액터를 갖습니다. 그래서 푸우 배우바 배우들. 내가 자바를 사용하여 플레이 프레임 워크의 최신 버전을 사용하고

messages = ReceiveMessagesFromQueue; // This is a live stream and it never stops. 
for message in messages: 
    if message has key1: 
      List<FooActors> foo_list = getAllFooActors 
      broadcast(message, foo_list) 
    else if message has key2: 
      List<BarActors> bar_list = getAllBarActors 
      broadcast(message, bar_list) 

:

ws://localshost/foo 

ws://localshost/bar 

https://www.playframework.com/documentation/2.5.x/JavaWebSockets

지금 내가하고 싶은 모든이

의사 코드입니다.

+0

[이 해결책] (http://stackoverflow.com/q/25057854/1804173)이 여기에 해당됩니까? – bluenote10

+0

그건 가까이서. 그리고 내 솔루션은 거의 99 % 동일하지만 모든 웹 소켓 종점에 대해 액터 목록을 유지하는 효과적인 방법이 있는지 확인하려고합니다. 배우 그룹 M에게 메시지 A를 방송하고 싶고 배우 그룹 N에 메시지 B를 방송하고 싶습니다. – user1870400

답변

0

나는 배우 목록을 관리해야하는 부담을 피할 것이지만, Akka의 Event Bus을 사용하여 좀 더 분리 된 접근법을 사용하려고합니다.

이렇게하면 논리적으로 주제 당 배우 (foo와 bar)를 그룹화 할 수 있습니다. 이것은 websocket 액터 나 메시지 큐 소비자가 상대방에 대해 알 필요가 없기 때문에 느슨하게 결합됩니다. 그들은 단순히 특정 주제에 가입하거나 게시해야합니다.

아래 코드는 lookup classification에 표시된 예제를 바탕으로 작성되었습니다.

시작, 당신의 웹 소켓 배우 대략, 해당 항목에 가입해야하는 단지 것 :

LookupBusImpl lookupBus = new LookupBusImpl(); 
lookupBus.subscribe(getSelf(), "foo"); // or "bar" 

귀하의 큐 소비자가 단순히 의사 코드를 작성, 해당 항목에 메시지를 게시해야합니다 :

분산 버전의 경우 Distributed Publish Subscribe in Cluster을 사용하십시오.