를 사용하여 응답에서는 배우 현재의 배우 프로세스

0

질문

내가 혼동에 대해 나는 어떻게 해결해야에서 이 시나리오를 차단하지 않는 방식이다.

고려 두 배우 Actor1Actor2

Actor1

Map<Int, Int> foo() {
     List<String> finalList = foo_2();
     Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;

     return finalMap;
}

List<String> foo_2() {
    
     CompletableFuture<List<String>> Querylist = ask(Actor2)
     Querylist.get();
     
     return QueryList;
}

현재에 foo_2, Querylist.get() 입니다. 고 싶어 어떻게든 이에 차단하지 않는 방식이다. 내가 만든 메시지가 어댑터 Actor2Actor1 그래서 어떤 메시지 Actor2 전송에 의해 처리됩 Actor1.

나는 사용하기 위해 다음과 같은 방법을 수정하면 차단하는 전화

Map<Int, Int> foo() {
     CompletionStage<List<String>> finalList = foo_2();
     finalList.whenComplete(
        // what to do here? 
     )
     // Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;

     return finalMap;
}

CompletionStage<List<String>> foo_2() {
    
     CompletionStage<List<String>> Querylist = ask(Actor2)
     
     
     return QueryList;
}

나는 확실하지 않은 방법이 올바르게 사용하 CompletionStage 구조와 같은 결과를 얻었을 얻으로 차단은 미래를 주려고 합니다.get()호출합니다.

2

최고의 응답

1

를 사용하는 경우 Akka 입력(암시에서 태그),할 필요가 없는 향후 또는 메시지가 어댑터에서 모두. 사 ActorContext.ask.

표시 문서는 요청에 대한 응답으로 물을 사이에 두 배우.

광범위하게,당신의 제거 foofoo_2 방법,이동 메시지가 어댑터 설정에 ActorContext.ask 전화 및 교체하는 경우 이전에 불린 foo 전화 ActorContext.ask. 는 경우에 회신 배우에 보내는 메시지를 주도하는 요청에 따라 달라는 응답을 요청한 다음,좋은 연습을 포함하려면 필요한 부분의 상태로 메시지가 어댑터를 생성합니다.

2021-10-25 00:19:07

답변 주셔서 감사합니다,이것은 내가 결국 이 방법을 사용했습니다. 당신은 무엇인 사이의 차이를 하고 있다.말()vs 를 사용하여 ActorContext.요청()? 는 차이가 있다는 통과"핸들러"에서 명시적으로 ActorContext.요청()?
PyWalker2797

Ask 궁극적으로 모든 작업을 관리하는 요청-응답의 상호 작용을 위해 당신에:그것의 상단에 내장 말한(더 많거나 적은 모든 것에 Akka 가,after all). 광범위하게 요청,생성 배우고를 주입에 대한 참조는 배우로 답변 주소에 메시지를 보낼 수 있습니다. 할 때는 배우 메시지를 수신,그것을 실행한 어댑터와 앞으로의 적용에 응답하여 배우는 보낸 요청는 배우에도 일정하는 메시지를 자신에 대한 후에는 시간이 초과되는 그것으로 변환 시간 제한 메시지입니다.
Levi Ramsey

그것 때문에 생성 배우를 받기 위한 답변,그것은 약간 덜보다 효율적으로 등록하는 메시지가 어댑터하고,알며,예약 시간 제한 메시지입니다. 그러나,당신이 할 수 있는 임의로 많은 요청은 다른 어댑터 항공편도:말+어댑터,충돌 할 수 있습의 한계를 한 어댑터 형식당(등록 다른 어댑터 동일한 유형의 예측할 수 있고 상속 또한 재생할 수 있습니다 혼란으로 이 방법). Tell+adapter 방법의 이점을 가지고 있도록 여러 대답.
Levi Ramsey

는 지웁니다. 당신은 대략 얼마나 중요한 오버헤드가?
PyWalker2797

수도 있을 다른 질문입니다.- stackoverflow.com/questions/69725512/...
PyWalker2797

오버헤드는 무시할 수:몇 백 바이트의 메모리고 아마 마이크로초 또는 그렇게 추가 지연 시간에 응답하 asker.
Levi Ramsey
1

당신이 사용할 수 있는 pipeToSelf참조하십시오 https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#send-future-result-to-self,결과를 보내의 요청하는 배 자체입니다. 하는 대신 값을 얻을 위한 finalList 에서 직접 foo()에서만 가능 차단 get의 결과 foo()로 전송될 수 있습 배우,그 자체에있는 경우에 당신은 그것을 처리 같은 다른 메시지가 나타납니다. 그것은 좋은 연습을 만드는 특정 메시지 유형이다.

당신은 또한에서 봐야 CompletionStage 방법,가장 중요한 것은 thenApply (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html#thenApply-java.util.function.Function-는)그것이 가능한 변환하는 결과를 위해 인스턴스를 만들기 MapfinalList고,인스턴스 MapMessageMap. 당신은 다음을 처리 MapMessage 다음과 같은 다른 어떤 메시지를 배우입니다.

2021-10-25 00:12:28

안녕하세요 감사합니다 당신의 대답이다. 궁극적으로 갔으로 받아들인 때문에 대답은 숙.
PyWalker2797

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................