2017-09-18 1 views
1

발신자 발신자 액터에 액세스해야합니다. Patterns.ask() 전화가 걸립니다. 예 : getSender().tell(...) : 보낸 사람에게 Patterns.ask()로 외부 액세스

ActorSystem system = ActorSystem.create("MySystem"); 
ActorRef actor = system.create(..., "MyActor"); 
Future<Object> futureResult = Patterns.ask(actor, new Question(), 10000); 

다음은 Akka 프레임 워크는 하여 응답 할 것이다 "MyActor" 배우에게 메시지를 보내드립니다.

보낸 사람은 Akka 프레임 워크에서 만든 액터가됩니다. 경로는 다음과 같습니다 (akka://MySystem/temp/$a). 어떻게받을 수 있습니까? ActorRef이이 배우는?

나는 위의 경로를 가지고 있지만 system.actorSelection을 호출 한 다음 resolveOne을 사용하면이 액터가 존재하지 않는다고 오류가 발생합니다 (참고 :이 발신자는 답변을받은 직후에 죽을 것입니다. 내가 만든 테스트는 심지어 getSender().tell() 메서드가 호출되기 전입니다.)

내 프로젝트의 Akka 버전을 2.5.4으로 업데이트하면이 문제가 발생했습니다. 그 전에는 임시 직원/발신자 액터에 액세스하는 데 문제가 없었습니다.

나는 Patterns.ask(ActorRef actor, Function<ActorRef,java.lang.Object> messageFactory, Timeout timeout)에 대해 읽었지만 그 배경에 대해 생각하고 있기 때문에 활용하지 못했습니다 (예제도 찾을 수 없음). 위의 방법이 다소 해결책이라면 예제 사용을 제공 할 수 있습니까?

내 문 중 하나가 위의 경우하지 완전히 사실 그름 - 당신의 수정을하시기 바랍니다! :)

감사합니다.

+0

>이 액터의 ActorRef를 어떻게 얻을 수 있습니까? 그 점은 무엇입니까? 응답 메시지는 임시 액터에 의해 무시됩니다. –

+0

비즈니스 로직에 필요하기 때문에 ** 시스템에서 배우 생성 **을 제공하는 API를 작성하고 있습니다. 어떤 시점에서 (실제'Patterns.ask()'가 호출 될 때)이 임시 액터에 대해 my API가 ** 요청 ** 될 것입니다. 이는 클라이언트가 액터의 동작을 결정하기 때문입니다. 그렇게하기 위해 내 클라이언트는 ** selfActor **, ** senderActor ** 및 ** message **와 같은 세 가지를 기대하는 ** 기능 **을 구현합니다. –

+0

나는 또한 당신이 성취하려는 것을 얻지 못합니다. "배우의 행동이 무엇인지 판단"하는 것은 무엇을 의미합니까? a) 배우가 무엇을하고 있는지 알아 내거나, b) 배우의 행동을 설정하십시오. A)는 쉽다 : 하나의 메시지의 내용을 약속의 가치로 설정하고, b) ask()을 사용하지 않고 자신의 배우를 생성하기 때문에 의미가 없다. 또한, 액터 ref를 얻고 자한다면, 어떻게 할 것인가, 어떻게 사용되어야하는지 생각해 봅시다. 나는 'MyActor'가 대답을 보내면 의미있는 것을 보지 못한다. 그런 다음 배우가 사라지고 심판이 유효하지 않게된다. –

답변

0

이 문제를 해결하는 방법은 원래 메시지를 "AskMessage"클래스라고 말하면서 래핑하는 것이 었습니다. 그런 메시지를 받으면 내 배우가 그 하나의 메시지를 처리하는 유일한 목적을 가진 임시 배우를 만듭니다. 그 후에 배우가 멈추게됩니다. 이 액터는 내 애플리케이션의 내부 API를 통해 결과를 통지합니다.

관련 문제