2012-12-07 3 views
0

Akka를 사용할 때 입출력 작업, 폴링, 대기 중, 잠자는 중 등을 막는 중요한 규칙을 읽었습니다.하지만 실제로 흐름 제어가 필요한 경우 어떻게해야합니까?Akka를 사용하여 흐름을 제어하려면 어떻게합니까?

저는 Akka 배우를 사용하여 고객에게 메일을 보내고 메일 서버에 익숙해지기 위해 5 초마다 하나의 메일을 보냅니다. 내 계획은 메일 보내기 작업을 수행하는 발송자와 흐름 제어를 수행하기 위해 발송자 액터를 사용합니다.

class Dispatcher extends Actor { 
    def receive = { 
    case ResetPassword(to, data) => 
     senderActor ! Mail("resetPassword", to, data) 
     Thread.sleep(5000) 
    ... 
    } 
} 
class Sender extends Actor { 
    def receive = { 
    case Mail(to, data) => // send the mail immediately 
    ... 
    } 
} 

이것이 올바른 방법입니까? 그렇지 않다면 어떻게 흐름 제어를해야합니까?

+1

이 시도하고 작업을 막지 않도록하는 것이 중요하지만, 그렇지 않습니다 어려운 규칙; http://doc.akka.io/docs/akka/2.1.0-RC3/general/actor-systems.html#Blocking_Needs_Careful_Management –

답변

7

차단없이이 작업을 수행하는 한 가지 방법은 언제든지 보낼 편지함 상태를 보유하는 다른 액터를 갖는 것입니다.

class Outbox extends Actor { 

    var outbox: List[Mail] = Nil 

    def receive = { 
    case a: Mail => { 
     outbox = outbox :+ a 
    } 

    case MailToSend => { 
     val maybeMailToSend = outbox.headOption 
     outbox = outbox.tail 
     senderActor ! maybeMailToSend 
    } 
    } 
} 

그런 다음 Sender 배우가 scheduled actor 폴링 보낼 편지함 5 초마다 수 있습니다. MailToSend 메시지를 Outbox 액터로 보내고 응답이 Some 인 경우 하나의 메일을 발송합니다.

이는 다음과 같이 보일 것이다 :

가 보낸 배우 예약을 :

system.scheduler.scheduleOnce(5 seconds, senderActor, PollOutbox) 

보낸 배우 :

class Sender extends Actor { 
    def receive = { 
    case PollOutbox => { 
     maybeMailToSend = outboxActor ? MailToSend 
     ... 
    } 
    } 
} 
+0

을 참조하십시오. [문서 링크] (http : //doc.akka. io/docs/akka/2.0/scala/scheduler.html)에 대한 자세한 내용과 예제 코드 스 니펫 – rjsvaljean

관련 문제