एक का उपयोग कर प्रतिक्रिया से एक अभिनेता के रूप में वर्तमान अभिनेता प्रक्रिया

0

सवाल

मैं उलझन में हूँ के बारे में कैसे मैं हल करना चाहिए इस परिदृश्य में एक गैर अवरुद्ध तरीके से.

दो अभिनेताओं पर विचार Actor1 और Actor2

के भीतर 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() एक अवरुद्ध कॉल. मैं करने के लिए चाहते हैं किसी भी तरह से इस को हल में एक गैर अवरुद्ध तरीके से. मैं बनाया एक संदेश के लिए एडाप्टर के लिए Actor2 अंदर Actor1 इसलिए किसी भी संदेश है कि 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 का निर्माण करने के लिए एक ही परिणाम मिलता है मैं हो रही थी के साथ एक अवरुद्ध वायदा.मिल() कॉल.

2

सबसे अच्छा जवाब

1

यदि आप का उपयोग कर रहे हैं अक्का टाइप (अव्यक्त से टैग), तुम नहीं करना चाहिए की जरूरत है एक भविष्य या एक संदेश एडाप्टर पर सभी. बस का उपयोग करें ActorContext.ask.

देखें प्रलेखन के लिए एक अनुरोध के साथ प्रतिक्रिया पूछने के बीच दो अभिनेताओं.

मोटे तौर पर, आप चाहते हैं से छुटकारा पाने के foo और foo_2 तरीकों, के लिए कदम संदेश अनुकूलक सेट अप करने में ActorContext.ask कॉल, की जगह है और उदाहरणों जहां आप पहले से कहा जाता है foo के साथ एक कॉल करने के लिए ActorContext.ask. यदि उत्तर के अपने अभिनेता के लिए भेजता है संदेश के लिए नेतृत्व जो पूछने पर निर्भर करता है, प्रतिक्रिया के लिए पूछना है, तो एक अच्छा अभ्यास है एम्बेड करने के लिए आवश्यक भागों का प्रदेश में संदेश एडाप्टर उत्पन्न करता है ।

2021-10-25 00:19:07

अपने जवाब के लिए धन्यवाद, यह है कि मैं क्या कर को समाप्त हो गया. होगा आप जानते हैं कि क्या है के बीच अंतर कर .बता() बनाम का उपयोग कर ActorContext.पूछो()? अंतर है कि आप गुजर रहे हैं, "हैंडलर" में स्पष्ट रूप से ActorContext.पूछो() ?
PyWalker2797

पूछो अंत में सब काम करता है के प्रबंधन के अनुरोध-प्रतिक्रिया बातचीत आप के लिए: यह के शीर्ष पर बनाया गया है बताता है (और अधिक या कम सब कुछ में अक्का है, सब के बाद). मोटे तौर पर, पूछ spawns एक अभिनेता और इंजेक्शन के लिए एक संदर्भ है कि अभिनेता के रूप में जवाब करने के लिए पता करने के लिए संदेश भेजें. जब कि अभिनेता एक संदेश प्राप्त करता है, इसे कार्यान्वित एडाप्टर और आगे अनुकूलित करने के लिए प्रतिक्रिया अभिनेता जो भेजा पूछना; कि अभिनेता भी कार्यक्रम के लिए एक संदेश के लिए अपने आप मध्यांतर के बाद समाप्त हो रहा है, जो इसे में बदल देती है मध्यांतर संदेश.
Levi Ramsey

क्योंकि यह spawns एक अभिनेता के लिए प्राप्त करने के जवाब में, यह मामूली से कम कुशल पंजीकरण एक संदेश एडाप्टर, एक बताओ, और शेड्यूलिंग एक मध्यांतर संदेश के लिए अपने आप को. हालांकि, आप कर सकते हैं मनमाने ढंग से कई पूछता है के साथ अलग अलग एडेप्टर में उड़ान के साथ: बता + एडाप्टर के साथ, आप हिट हो सकता है की सीमा एक एडाप्टर प्रकार प्रति (पंजीकरण एक अलग एडाप्टर के लिए एक ही प्रकार हो सकता है अप्रत्याशित और विरासत भी कहर खेल इस दृष्टिकोण के साथ). बता + एडाप्टर दृष्टिकोण क्या फायदा है की अनुमति देता है एकाधिक उत्तर.
Levi Ramsey

साफ करता है कि एक बहुत कुछ है । क्या आप जानते हैं कैसे महत्वपूर्ण भूमि के ऊपर है?
PyWalker2797

आप कर सकते हैं यह भी मेरी मदद के साथ एक और सवाल है। - stackoverflow.com/questions/69725512/...
PyWalker2797

भूमि के ऊपर नगण्य है: एक कुछ सौ बाइट्स स्मृति की खपत और शायद एक microsecond या तो अतिरिक्त विलंबता में हो रही करने के लिए उत्तर 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-) जो बनाता है यह संभव करने के लिए रूपांतरण परिणाम, उदाहरण के लिए, बनाने के लिए एक Map से finalListहै , और उदाहरण के लिए एक MapMessage से Map. फिर आप को संभाल MapMessage की तरह किसी भी अन्य संदेश में अभिनेता है ।

2021-10-25 00:12:28

हाय अपने जवाब के लिए धन्यवाद. अंत में मैं चला गया के साथ स्वीकार किए जाते हैं जवाब देने के बाद से यह लगता है अधिक मुहावरेदार.
PyWalker2797

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................