2017-10-15 12 views
0

gRPC와 Akka를 동시에 사용해야하는 이유가 있습니다. 이 배우가 최고 배우로 시작되면 아무 것도 잘못되지 않습니다 (이 작은 데모에서). 그러나 아이의 배우가 될 때, 어떤 메시지를받을 수 없으며, 다음과 같은 상황이 기록됩니다ExecutionContext로 인해 Akka 데드 레터가 발생합니다.

[default-akka.actor.default-dispatcher-6] [akka://default/user/Grpc] Message [AkkaMessage.package$GlobalStart] from Actor[akka://default/user/TrackerCore#-808631363] to Actor[akka://default/user/Grpc#-1834173068] was not delivered. [1] dead letters encountered. 

예 코어 :

: 나는 같은 새로운 ExecutionContext을 만들려고

class GrpcActor() extends Actor { 
    val ec = scala.concurrent.ExecutionContext.global 
    val service = grpcService.bindService(new GrpcServerImpl(), ec) 
    override def receive: Receive = { 
     case GlobalStart() => { 
      println("GlobalStart") 
     } 
     ... 
    } 
} 

scala.concurrent.ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)) 

왜 이런 일이 생기고 이와 같은 죽은 글자 문제를 디버그 할 수 있습니까? 예외는 발생하지 않습니다.

업데이트 :

미안 내가 여기에 모든 것을 나열하지 않았다. 정상적인 Main 메서드를 사용하여 최고 액터로 GrpcActor을 테스트하고 ScalaTest를 자식 액터로 테스트했습니다. 이는 실수입니다.

class GrpcActorTest extends FlatSpec with Matchers{ 
    implicit val system = ActorSystem() 
    val actor: ActorRef = system.actorOf(Props[GrpcActor]) 
    actor ! GlobalStart() 
} 

전체 액터 시스템을 활성 종료하는 것은이 빈 테스트 모음입니다. 그러나 문제는이 줄에 있습니다

배달 종료 후 GlobalStart() 배달이 지연되었습니다.

해당 줄이 없으면 종료 전에 메시지를 배달 할 수 있습니다.

정상적인 동작입니까?

(내 생각 : GlobalStart() 일부 무거운 작업을했고, 시간의 차이를 만든 그 라인과 종료 메시지 후 대기중인 것을 무슨 일이 있었)

+0

문법 오류를 수정하고이 질문을 완성 해 주신 것에 대해 감사드립니다. – Skye347

답변

0

한 가지 방법을 말할 수있는 것은 만드는 것입니다 servicelazy val :

class GrpcActor extends Actor { 
    ... 
    lazy val service = grpcService.bindService(new GrpcServerImpl(), ec) 
    ... 
} 

lazy val 장기 실행 작업에 유용에 이 경우 최초로 사용될 때까지 service의 초기화를 연기합니다. lazy 수정자가 없으면 액터가 만들어 질 때 service이 초기화됩니다.

다른 방법은 완전히 초기화 한 배우가되기 전에 종료에서 배우 시스템을 방지하기 위해 테스트에 Thread.sleep을 추가하는 것입니다

class GrpcActorTest extends FlatSpec with Matchers { 
    ... 
    actor ! GlobalStart() 
    Thread.sleep(5000) // or whatever length of time is needed to initialize the actor 
} 

(사이드 참고로,의 Akka Testkit 사용을 고려하여 배우 시험.)

0

부모에 감독자 전략을 추가하기로에 println 추가 액터 라이프 사이클. 배우를 죽이는 무언가가 있습니다. 당신이 완전한 예제를 제공하는 경우 마지막으로, 어쩌면 내가 문제를 해결하기 위해 더 :