Akka Typed에서 AskPattern.ask를 사용하는 방법? (자바 / 코 틀린)

제니스 리

Akka Typed에서 Ask Pattern을 사용하는 데 약간의 문제가 있습니다. 액터 외부에서 메시지를 보내려고 하고이 예제 를 따르려고했습니다 . 그러나 내 설정이 예제와 약간 다르다고 생각합니다.

object SimulatorManager {

    fun create(): Behavior<SimulatorManagerMessage> {
        val state = ... // initialize state
        return waitingToStartSimulation(state)
    }

    private fun waitingToStartSimulation(state: SimulatorManagerState): Behavior<SimulatorManagerMessage> {
        return Behaviors.receive { context, message ->
            when (message) {
                is StartSimulation -> {
                    // start simulation and update state
                    waitingToStartSimulation(state)
                }
                else -> Behaviors.same()
            }
        }
    }
}

sealed class SimulatorManagerMessage

data class StartSimulation(
    val consumer: ConsumerCredentials,
    val storeId: Long,
    val itemId: Long,
    val simTimeIncrement: Double,
    val realTimeIncrement: Double,
) : SimulatorManagerMessage()

액터 시스템 외부에서 StartSimulation메시지 를 보내려고합니다 SimulatorManager. 그러나 replyTo함수 매개 변수 에 무엇을 입력해야할지 고민하고 있습니다.

class SimulatorController(
    val systemRef: ActorSystem<SimulatorManagerMessage>,
    private val simManagerRef: ActorRef<SimulatorManagerMessage>
) {

    fun startSimulation(request: StartSimulationRequest) {
        val msg = request.toMessage()
        val result = AskPattern.ask<SimulatorManagerMessage, SimulatorController>(
            simManagerRef,
            { replyTo ->  },        // what should go here? 
            Duration.ofSeconds(15),
            systemRef.scheduler()
        )
    }
}

매개 변수의 유형이이어야한다고 Function<ActorRef<SimulatorController!>!, SimulatorManagerMessage!>!말하지만 이와 같은 함수를 만드는 방법을 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다!

레비 램지

replyTo -> 함수는 보낼 메시지를 구성하고 응답으로 메시지를받을 액터에 대한 참조를 삽입합니다.

이는 비 동기화하기 위해 요청 패턴이 효과적으로 수행하는 작업이 다음과 같기 때문입니다.

  • 어떤 배우에게 메시지 보내기 ( "A"라고 부르기)
  • 응답을 수신하고 해당 응답으로 미래를 완료하기위한 유일한 목적으로 액터 (액터 "B")를 생성합니다 (또는 시간 초과에 도달하면 해당 미래에 실패합니다. 액터 "B"는 메시지를 받자 마자 스스로 중지됩니다. 시간 초과)

고전적인 (유형이 지정되지 않은) Akka에서 메시지는 수신자 sender가 모든 메시지를 결정할 수 있도록 구성 될 것이므로 요청 패턴은 매우 간단합니다 (액터로부터 요청을 보낼 때 결과 미래에주의해야합니다. 당신이 할 수있는 유일한 안전한 일은 메시지를 수정하고 그것을 당신의 우편함에 파이프하는 것입니다).

Akka Typed에서는 ActorRef이제 보낼 수있는 메시지를 제어 하기 때문에 sender사용할 수 없습니다. 따라서 이제 프로토콜을 구성하는 메시지에서 예상되는 응답의 유형을 명시 적으로 모델링해야합니다.

이것이 내가 작성한 첫 번째 Kotlin이라고 고백하는 곳이지만 다음과 같은 내용이있을 수 있습니다.

sealed class GradebookCommand

data class GetGradeFor(val student: String, val replyTo: ActorRef<GradeForStudent>): GradebookCommand()

data class GradeForStudent(val student: String, val score: Int, val outOf: Int)

sealed class GradebookRouterCommand

data class GetGradebookActorFor(val classId: String, val replyTo: ActorRef<GradebookIs>): GradebookRouterCommand()

data class GradebookIs(val classId: String, val gradebookActor: ActorRef<GradebookCommand>)

그 가정하는 것은 그래서 gradebookRouter입니다 ActorRef<GradebookRouterCommand>, 당신은에 물어 것

val classId: String = "asdf"
val gradebookFuture: CompletionStage<GradebookIs> =
  AskPattern.ask<GradebookRouterCommand, GradebookIs>(
    gradebookRouter,
    { replyTo -> GetGradebookActorFor(classId, replyTo) },
    Duration.ofSeconds(15),
    systemRef.scheduler
  )

gradebookFuture최종적으로 답장을 보내 게 된 GradebookIs메시지 로 완성 될 것입니다 gradebookRouter(이 표현을 사용하는 이유 중 하나 replyTo는 작업을 다른 배우에게 위임 할 수 있다는 것입니다. Akka Classic에서도 가능하지만 엉망으로 만들기 쉬운 보낸 사람을 보존하는 데 약간의 미묘함이 있습니다.)

// This is perhaps where my Kotlin/Java futures code goes off the rails
val student: String = "Parry Hotter"
val gradeFuture: CompletionStage<GradeForStudent> =
  gradebookFuture.thenComposeAsync({ gradebook ->
    AskPattern.ask<GradebookCommand, GradeForStudent>(
      gradebook,
      { replyTo -> GetGradeFor(student, replyTo) },
      Duration.ofSeconds(15),
      systemRef.scheduler
    )})

면책 조항 : Scala와 관련된 Java / Kotlin 유형 시스템의 미묘함 (예 : 공분산 / 반반 변성)으로 인해 해당 코드가 작동하지 않을 수 있지만, 이것이 합리적으로 명확 해지기를 바랍니다.

TL; DR : 회신 주소로 사용되는 메시지에 필드가 있는지 확인하십시오. replyTo그것은 확실히 관습으로 등장했지만 이름을 붙일 필요는 없습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

코 틀린에서 자바 객체를 초기화하는 방법

분류에서Dev

어떻게 코 틀린 방법으로 자바에서 매개 변수로 함수를 전달하는 방법?

분류에서Dev

자바에서 코 틀린 동반자 개체에 액세스하는 방법

분류에서Dev

코 틀린에서의 BufferedReader를 사용하는 가장 좋은 방법

분류에서Dev

공공 방법으로 자바 클래스에서 상속 코 틀린에 보호 클래스를 수용

분류에서Dev

코 틀린에 대한 중위로 자바 메소드를 선언하는 방법이 있나요

분류에서Dev

자바에 코 틀린에 핸들러로 변환하는 방법

분류에서Dev

코 틀린 기본 자바 패키지를 가져 오는 방법

분류에서Dev

코 틀린 자바 7에서 코 루틴 기능을 일시 중단 호출하는 방법

분류에서Dev

코 틀린를 사용하여 for 루프에서 특정 번호를 인쇄하는 방법

분류에서Dev

사람이 자바에 다음 코드 코 틀린를 변환 할 수

분류에서Dev

코 틀린 : HTML 번호없이 문자열에 HTML 번호를 문자열로 변환하는 방법

분류에서Dev

자바에서 코 틀린 싱글 사용

분류에서Dev

Grails의에서 코 틀린를 사용하는 것이 가능?

분류에서Dev

자바에서 봉인 된 클래스로 매개 변수를 사용하여 코 틀린 함수를 호출

분류에서Dev

어떻게 코 틀린 방법으로 자바에서 람다를 전달합니까?

분류에서Dev

어떻게 또한 자바에서 불변의 목록입니다 코 틀린에있는 불변의리스트를 만드는 방법?

분류에서Dev

클래스가 코 틀린 또는 자바 반사를 사용하여 인터페이스에서 기본 메소드를 오버라이드 (override) 한 경우 확인하는 방법?

분류에서Dev

자바에서 코 틀린에 findViewById를 변환

분류에서Dev

자바 라이브러리 코 틀린 네이티브를 추가하는 방법

분류에서Dev

자바에 의해 코 틀린 클래스를 확장하는 것은 구현할 이미 구현 방법에 저를 필요

분류에서Dev

자바에서 코 틀린 객체를 호출 할 때 왜 우리는 이상한 방법 이름을받을 수 있나요?

분류에서Dev

액세스 코 틀린 자바에서 클래스를 봉인

분류에서Dev

자바에서 코 틀린의 고차 함수를 호출

분류에서Dev

코 틀린에 상속 생성자하는 방법은 무엇입니까?

분류에서Dev

자바 기능에 콜백이 코 틀린 기능을 변환하는 방법에 캔 누군가의 도움이 나를?

분류에서Dev

코 틀린에 자바 사용자 정의 주석을 사용하여

분류에서Dev

어떻게 코 틀린에 마무리 ()를 구현하는 방법?

분류에서Dev

코 틀린 자바 방법을 숨길 수있는 방법이 있습니까?

Related 관련 기사

  1. 1

    코 틀린에서 자바 객체를 초기화하는 방법

  2. 2

    어떻게 코 틀린 방법으로 자바에서 매개 변수로 함수를 전달하는 방법?

  3. 3

    자바에서 코 틀린 동반자 개체에 액세스하는 방법

  4. 4

    코 틀린에서의 BufferedReader를 사용하는 가장 좋은 방법

  5. 5

    공공 방법으로 자바 클래스에서 상속 코 틀린에 보호 클래스를 수용

  6. 6

    코 틀린에 대한 중위로 자바 메소드를 선언하는 방법이 있나요

  7. 7

    자바에 코 틀린에 핸들러로 변환하는 방법

  8. 8

    코 틀린 기본 자바 패키지를 가져 오는 방법

  9. 9

    코 틀린 자바 7에서 코 루틴 기능을 일시 중단 호출하는 방법

  10. 10

    코 틀린를 사용하여 for 루프에서 특정 번호를 인쇄하는 방법

  11. 11

    사람이 자바에 다음 코드 코 틀린를 변환 할 수

  12. 12

    코 틀린 : HTML 번호없이 문자열에 HTML 번호를 문자열로 변환하는 방법

  13. 13

    자바에서 코 틀린 싱글 사용

  14. 14

    Grails의에서 코 틀린를 사용하는 것이 가능?

  15. 15

    자바에서 봉인 된 클래스로 매개 변수를 사용하여 코 틀린 함수를 호출

  16. 16

    어떻게 코 틀린 방법으로 자바에서 람다를 전달합니까?

  17. 17

    어떻게 또한 자바에서 불변의 목록입니다 코 틀린에있는 불변의리스트를 만드는 방법?

  18. 18

    클래스가 코 틀린 또는 자바 반사를 사용하여 인터페이스에서 기본 메소드를 오버라이드 (override) 한 경우 확인하는 방법?

  19. 19

    자바에서 코 틀린에 findViewById를 변환

  20. 20

    자바 라이브러리 코 틀린 네이티브를 추가하는 방법

  21. 21

    자바에 의해 코 틀린 클래스를 확장하는 것은 구현할 이미 구현 방법에 저를 필요

  22. 22

    자바에서 코 틀린 객체를 호출 할 때 왜 우리는 이상한 방법 이름을받을 수 있나요?

  23. 23

    액세스 코 틀린 자바에서 클래스를 봉인

  24. 24

    자바에서 코 틀린의 고차 함수를 호출

  25. 25

    코 틀린에 상속 생성자하는 방법은 무엇입니까?

  26. 26

    자바 기능에 콜백이 코 틀린 기능을 변환하는 방법에 캔 누군가의 도움이 나를?

  27. 27

    코 틀린에 자바 사용자 정의 주석을 사용하여

  28. 28

    어떻게 코 틀린에 마무리 ()를 구현하는 방법?

  29. 29

    코 틀린 자바 방법을 숨길 수있는 방법이 있습니까?

뜨겁다태그

보관