Geçerli aktör sürecinde bir aktörden yanıt kullanma

0

Soru

Bu senaryoyu engellenmeyen bir şekilde nasıl çözmem gerektiği konusunda kafam karıştı.

İki aktör düşünün Actor1 ve Actor2

İçinde 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;
}

Şu anda foo_2 içinde, Querylist.get() engelleme çağrısıdır. Bunu bir şekilde engellenmeyen bir şekilde çözmek istiyorum. Bunun için bir ileti bağdaştırıcısı oluşturdum Actor2 içinde Actor1 yani herhangi bir mesaj Actor2 gönderiler tarafından ele alınacaktır Actor1.

Engelleme çağrısını değiştirmek için aşağıdaki yaklaşımı kullandım

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;
}

Bir engelleme geleceği ile elde ettiğim aynı sonucu elde etmek için CompletionStage yapısını doğru bir şekilde nasıl kullanacağımdan emin değilim.get () çağrısı.

2

En iyi cevabı

1

Akka Yazılı (etiketten ima edilen) kullanıyorsanız, bir geleceğe veya bir ileti bağdaştırıcısına hiç ihtiyacınız olmamalıdır. Sadece kullan ActorContext.ask.

İki aktör arasında sor ile istek yanıtı için belgelere bakın.

Genel olarak, kurtulmak istiyorum foo ve foo_2 yöntemler, kurduğunuz ileti bağdaştırıcısını ActorContext.ask arayın ve daha önce aradığınız örnekleri değiştirin foo bir çağrı ile ActorContext.ask. Aktörünüzün sormaya yol açan iletiye gönderdiği yanıt, sormaya verilen cevaba bağlıysa, bağdaştırıcının oluşturduğu iletiye gerekli durum bölümlerini gömmek iyi bir uygulamadır.

2021-10-25 00:19:07

Cevabın için teşekkürler, sonunda yaptığım şey buydu. A yapmak arasındaki farkın ne olduğunu biliyor musunuz ?tell () vs ActorContext kullanarak.sor()? "İşleyici" açıkça ActorContext geçirdiğiniz farktır.sor() ?
PyWalker2797

Ask sonuçta yaptığı iş yönetme isteği-tepki etkileşimi: onu yerleşik üst anlatıyor (daha fazla veya daha az her şeyi Akka, sonrasında tüm). Genel olarak, ask bir aktör oluşturur ve gönderilecek iletide yanıt adresi olarak o aktöre bir başvuru enjekte eder. Bu aktör bir ileti aldığında bağdaştırıcıyı çalıştırır ve uyarlanmış yanıtı, isteği gönderen aktöre iletir; Bu aktör, zaman aşımı süresi dolduktan sonra zaman aşımı iletisine dönüştürdüğü için kendisine bir ileti de planlar.
Levi Ramsey

Yanıtı almak için bir aktör oluşturduğundan, bir ileti bağdaştırıcısını kaydetmekten, bir ileti yapmaktan ve kendinize bir zaman aşımı iletisi planlamaktan marjinal olarak daha az verimlidir. Bununla birlikte, uçuşta farklı adaptörlerle keyfi olarak birçok istekte bulunabilirsiniz: tell + adapter ile, tip başına bir adaptörün sınırına vurabilirsiniz (aynı tip için farklı bir adaptörün kaydedilmesi öngörülemez olabilir ve kalıtım da bu yaklaşımla hasara yol açabilir). Tell + adapter yaklaşımı, birden çok cevaba izin verme avantajına sahiptir.
Levi Ramsey

Bu çok şeyi açıklığa kavuşturuyor. Genel giderin ne kadar önemli olduğunu biliyor musun?
PyWalker2797

Sen de bana yardım edecek başka bir soru.- stackoverflow.com/questions/69725512/...
PyWalker2797

Ek yük önemsizdir: birkaç yüz bayt bellek tüketimi ve muhtemelen askere yanıt alınmasında mikrosaniye kadar ekstra gecikme.
Levi Ramsey
1

Kullanabilirsiniz pipeToSelf, bakın https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#send-future-result-to-self. isteğin sonucunu aktörün kendisine göndermek için. Bunun için değer elde etmeye çalışmak yerine finalList sadece bir engelleme ile mümkün olan doğrudan foo () içinde get, foo () sonucu aktörün kendisine gönderilebilir, bu durumda onu başka bir mesaj gibi ele alırsınız. Bunun için belirli bir ileti türü oluşturmak iyi bir uygulamadır.

Ayrıca bir göz atmalısınız CompletionStage yöntemler, en önemlisi thenApply (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html#thenApply-java.util.function.Function-) sonuçları dönüştürmeyi mümkün kılan, örneğin bir Map şuradan finalList ve mesela bir MapMessage şuradan Map. O zaman sen hallederdin. MapMessage aktördeki diğer mesajlar gibi.

2021-10-25 00:12:28

Merhaba Teşekkürler cevap için. Sonuçta, daha deyimsel göründüğü için kabul edilen cevapla gittim.
PyWalker2797

Diğer dillerde

Bu sayfa diğer dillerde

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