2014-04-04 1 views
0

메시지가 말 또는 질문인지 확인할 수있는 방법이 있습니까?Akka - 메시지가 말 또는 질문인지를 아는 방법?

사용 사례 : 나는 도서관이 배우의 외부에서 사용하고 메시지에 사용되는 알려줍니다 사례를보고 있어요

. 라이브러리는 성공/실패에 대한 결과로 회신하기 때문에 사용법에서는 신경 쓰지 않고 배우가 아닌 컨텍스트에 메시지를 전달하고 수신합니다. 기본적으로 메시지는 정상적으로 작동하지만 메시지를 기록하는 deadLetters로 이동합니다. 로그를 조정하여 메시지를 닫을 수는 있지만 메시지가 특정 메시지 유형 (예 : fire 및 forgets vs asks)을 수행하지 않고 라이브러리 안의 tell 또는 ask인지 확인하는 방법이 있는지 궁금합니다. .

+0

기압 테스트하지만, 생각 할 수 없다'ActorRef.noSender() 등호 (발신자())'? – tariksbl

+0

보낸 사람의 경로를 살펴볼 수 있습니다. ask 패턴으로 생성 된 임시 액터는/system으로 시작하고 여러분이 작성한 정규 액터는/user로 시작한다고 생각합니다. 나는이 방법을 사용하는 것이 중요하다고 생각하지 않기 때문에 이것을 사용하는 것을 권유하지는 않을 것이다. 그러나 정말로 필요하다면 효과가있을 것이다. – cmbaxter

+0

예 배우 경로 파싱을 생각했습니다 임시 액터 (예 : 요청)가 임시 경로에 등록되어 있다는 것이 맞습니다. 그래도 Akka의 구체적인 세부 사항에 정말 열심히 커플하는 것 같습니다. – JasonG

답변

1

내 메시지 유형에는 항상 "답장"필드가 포함됩니다. 때때로 나는 그것을 Option[ActorRef]으로 만들지 만 종종 반복되는 매개 변수를 사용합니다 (응답 전송을 일반화하고 모든 사례를 더 깨끗하게합니다 - no None/Some(replyTo)/List (replyOne, replyTwo ...) 등). 반복 매개 변수 접근법은 암시 적 클래스에 의해 촉진됩니다 !* 메소드를 제공하여 팬 아웃을 허용합니다. 그래서

,이 같은 :.

case class Req(i: Int, s: String, replyTo: ActorRef*) 
case class Resp(mesg: String) 

class MyActor extends Actor { 
    ... 
    def receive = { 
    case Req(i, s, replyTo) => ... replyTo !* Resp("Consider it handled") 
    ... 
    } 
    ... 
} 
+0

이상하게 보입니다. 송신자, 전달 또는 pipeTo를 사용하여 응답 할 단일 액터 인 경우 올바른 메시지로 메시지가 다시 돌아올 수 있도록 할 수 있습니다. 여러 청취자의 경우, 모든 메시지가있는 액터 목록을 보내지 않고 청취자를 등록하고 액터의 상태로 유지하는 것이 더 좋을 것이라고 생각합니다. 그냥 의견을 분명히 - 문제 해결을위한 솔루션을 여전히 +1합니다. 나는 원래 akka에서 뭔가를 찾고있었습니다. – JasonG

+0

메시지 흐름의 토폴로지가 매우 정적으로 결정되면 제대로 작동하지만 라우팅 동적 기능을 유용하게 사용하면 유연성을 얻을 수 있습니다. –

+0

다시 고려해 보는 것은 흥미로운 생각입니다. tell 메소드를 사용하면 암시 적으로 ActorRef에 대한 응답을 지정할 수도 있습니다. 나는 이러한 요구를 충족시키기 위해 언제 어디서나 akka API를 사용하는 것을 선호합니다. – JasonG

관련 문제