2011-11-10 4 views
5

OOM을 피하기 위해 일부 Akka 1.1.3 액터의 사서함 크기를 공유 사용자 지정 디스패처로 제한합니다. 예를 들어 : (: actor.stop()가, 잠깐 것처럼 슬프게 보이고, actor.start()ActorStartException가 발생합니다 보조 노트를) 내가 좋아하는 것 핸들 Akka 액터 바운드 사서함 MessageQueueAppendFailedException

object Static { 
    val dispatcher = Dispatchers.newExecutorBasedEventDrivenWorkStealingDispatcher(
     "customDispatcher", 
     1000, 
     BoundedMailbox(capacity = 10) 
    ) 
} 

class MyActor extends Actor { 
    self.dispatcher = Static.dispatcher 
    ... 
} 

그래서 나는 메시지 상류 생산자 일시 중지 할 수 있습니다 넘쳐 사서함에 반응합니다. 대기열 채우기와 대기열 배출 사이에는 약간의 데이터 손실이 허용됩니다.

Dispatchers에 Akka의 장 메시지를 내 사서함 에 추가 할 수없는 경우 ("BlockingMessageTransferQueue이 전송 시간 초과")

그것이 MessageQueueAppendFailedException을 던질 것이다 액터에 메시지를 보내려고 할 때 말한다 pushTimeout에 의해 지정된 시간.

어디에서이 예외를 잡을 수 있습니까?

모든 myActor ! message을 try/catch로 랩핑해야하는 것처럼 문서화하면 소리가납니다. 그게 맞습니까? 나는 정말로 그 취급을 중앙 집중시키고 싶다. 내 Supervisor 아마 그것을 가로 채고 내 처리기를 실행할 수 있습니까?

+0

검사의 목적은 무엇입니까? –

+0

이것이 특정 사례에 적용되는지 확신 할 수 없지만 사서함이 넘칠 위험이있는 상황에 처한 경우 소비자 행동가가 생산자가 아닌 생산자에게 작업을 요청하는 "풀"디자인을 고려할 수 있습니다 귀하의 소비자를 스팸. –

+0

@Viktor 그것은 특히 소비자를 일시 중지하기 위해 업스트림 조치를 취하는 것입니다 (이 질문에이를 추가 할 것입니다). 댄이 맞아요, 그리고 당연히 끌어 당기는 모델을 고려할 것입니다. 그러나 지금은 거의 재구성하지 않고이 작업을 수행하고 싶습니다. 데이터 손실은 용납됩니다. – Bluu

답변