2010-05-26 7 views
1

저는 스칼라와 배우가 처음입니다. 그러한 가설적인 상황을 구현해야합니다 : 서버가 메시지를 기다렸다가 10 초 동안 아무런 메시지가 나타나지 않으면 클라이언트에 메시지를 보냅니다. 그렇지 않으면 수신 메시지를 수신합니다. 메시지를 처리하는 중에 다른 메시지가 오면 대기열에 넣어야합니다 (스칼라 액터가 자동으로 처리한다고 가정합니다).액터의 타임 아웃 구현

내가 만나는 두 번째 문제는 잠자는 것입니다. 배우가 메시지를받을 때 일정한 시간 동안 잠을 자야합니다. 그러나 다른 한편으로는 들어오는 메시지를 추가 처리를 위해 대기열에 넣고 싶기 때문에 차단할 수 없습니다.

답변

6

방법에 대해?

loop { 
    reactWithin(10000) { 
    case TIMEOUT => // send message to client 
    case work => // do work 
    } 
} 
+0

2016 년에 이것을 읽었습니다. 확실하지 않습니다 - 이것은 scala에 관한 것입니다 .actors? 그렇다면 어떻게 akka.actor로 변환할까요? – Suma

+0

@Suma 예, 잘 모르겠습니다. –

1

다니엘은 질문의 무 입력 조건 부분에 대해 더 나은 대답을 제공합니다. 그래서 저는 열등한 솔루션을 편집했습니다.

질문의 지연된 응답 부분에 대해서는 메시지 대기열이 배우가 잠든 동안 차단되지 않습니다. 잠잘 수 있으며 메시지는 계속 누적됩니다.

: 당신은 당신이 그것을 처리 할 때까지 메시지를 수신 할 때부터 고정 된 지연을 원하는 경우

그러나, 당신은, 예를 들어, 즉시 작동하지만 지연에 대한 요청에 메시지를 랩하는 배우를 만들 수 있습니다

case class Delay(when: Long, what: Any) { } 

// Inside class DelayingActor(workingActor: Actor) 
case msg => workingActor ! Delay(delayValue + System.currentTimeMillis , msg) 

그런 작업 배우 것

case Delay(t,msg) => 
    val t0 = System.currentTimeMillis 
    if (t>t0) Thread.sleep(t - t0) 
    msg match { 
    // Handle message 
    } 
+0

고마워, 그것이 내가 찾고 있었던 것이다. – Darek