कैसे बारी करने के लिए एक मोनो में वास्तव में एक अतुल्यकालिक (नहीं प्रतिक्रियाशील!) विधि कॉल?

0

सवाल

मैं एक विधि है

@Service
public class MyService {
    public Mono<Integer> processData() {
        ... // very long reactive operation
    }
}

सामान्य में कार्यक्रम का प्रवाह है, मैं इस विधि कॉल एसिंक्रोनस रूप से के माध्यम से एक काफ्का की घटना है ।

परीक्षण प्रयोजनों के लिए मैं करने के लिए की जरूरत बेनकाब विधि के रूप में एक वेब सेवा है, लेकिन इस पद्धति को उजागर किया जाना चाहिए के रूप में अतुल्यकालिक: लौटने केवल HTTP कोड 200 ठीक ("अनुरोध स्वीकार किए जाते हैं") और सतत डेटा प्रसंस्करण पृष्ठभूमि में.

यह ठीक है (= यह नहीं करता है किसी भी अवांछित साइड इफेक्ट) सिर्फ कॉल करने के लिए Mono#subscribe() और वापसी नियंत्रक से विधि है?

@RestController
@RequiredArgsConstructor
public class MyController {
    private final MyService service;

    @GetMapping
    public void processData() {
        service.processData()
            .subscribeOn(Schedulers.boundedElastic())
            .subscribe();
    }
}

या यह बेहतर करने के लिए इसे इस तरह से (यहाँ मैं उलझन में हूँ से चेतावनी से इंटेलीजे, शायद के रूप में एक ही https://youtrack.jetbrains.com/issue/IDEA-276018 ?):

public Mono<Void> processData() {
    service.processData()
        .subscribeOn(Schedulers.boundedElastic())
        .subscribe(); // IntelliJ complains "Inappropriate 'subscribe' call" but I think it's a false alarm in my case(?)
    return Mono.empty();
}

या कुछ अन्य समाधान है?

2

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

3

यह ठीक है (= यह नहीं करता है किसी भी अवांछित साइड इफेक्ट) सिर्फ कॉल करने के लिए मोनो#सदस्यता लें() और वापसी नियंत्रक से विधि है?

वहाँ साइड इफेक्ट होते हैं, लेकिन आप ठीक हो सकता है उनके साथ रहने वाले:

  • यह सही मायने में है आग और भूल जाते हैं - जिसका अर्थ है, जबकि आप कभी नहीं के बारे में सूचित किया, एक सफलता (जो ज्यादातर लोगों को एहसास), तुम भी कभी नहीं अधिसूचित किया जा सकता है के बारे में एक विफलता (जो अब तक कम लोगों को एहसास.)
  • यदि इस प्रक्रिया लटकी हुई है के लिए कुछ कारण है, कि प्रकाशक कभी नहीं पूरा हो जाएगा, और आप कोई रास्ता नहीं है जानने का. के बाद से आप कर रहे हैं सदस्यता लेने पर घिरे लोचदार threadpool, यह भी टाई अप उन में से एक सीमित धागे अनिश्चित काल के लिए भी.

पहली बात आप ठीक हो सकता है के साथ, या आप चाहते हो सकता है डाल करने के लिए कुछ त्रुटि लॉगिंग आगे नीचे है कि प्रतिक्रियाशील श्रृंखला के रूप में एक पक्ष प्रभाव किसी भी तरह तो आप कम से कम एक आंतरिक अधिसूचना अगर कुछ गलत हो जाता है ।

दूसरी बात के लिए - मैं सुझा था एक डाल (उदार) मध्यांतर पर अपने विधि कॉल तो यह कम से कम रद्द हो जाता है, तो यह अभी पूरा नहीं में एक निर्धारित समय है, और अब चारों ओर लटक लेने वाली संसाधनों. यदि आप चल रहे हैं एक अतुल्यकालिक कार्य है, तो यह नहीं है एक मुद्दे के रूप में यह होगा बस के एक बिट का उपभोग स्मृति. यदि आप कर रहे हैं, लपेटकर एक अवरुद्ध कॉल पर लोचदार अनुसूचक तो यह और भी बदतर है हालांकि, के रूप में आप कर रहे हैं बांधने एक धागे में है कि threadpool अनिश्चित काल के लिए.

मैं भी क्यों सवाल आप की जरूरत है का उपयोग करने के लिए घिरा लोचदार अनुसूचक सब पर यहाँ - यह रैपिंग के लिए इस्तेमाल किया कॉल अवरुद्ध, जो होना प्रतीत नहीं होता नींव के इस प्रयोग के मामले में. (करने के लिए स्पष्ट हो सकता है, अगर आपकी सेवा अवरुद्ध है, तो आप चाहिए पूरी तरह से लपेट लोचदार पर अनुसूचक - लेकिन यदि नहीं, तो वहाँ कोई कारण नहीं ऐसा करने के लिए.)

अंत में, इस उदाहरण के लिए:

public Mono<Void> processData() {
    service.processData()
        .subscribeOn(Schedulers.boundedElastic())
        .subscribe();
    return Mono.empty();
}

...एक शानदार उदाहरण क्या नहीं करना है, के रूप में आप कर रहे हैं बनाने के लिए एक तरह की "ठग प्रतिक्रियाशील विधि" - किसी को बहुत हद तक सदस्यता है कि करने के लिए लौट आए प्रकाशक सोच यह पूरा हो जाएगा जब अंतर्निहित प्रकाशक से पूरा करती है, जो स्पष्ट रूप से नहीं है क्या हो रहा है यहाँ. का उपयोग कर एक void वापसी प्रकार और इस प्रकार लौट नहीं कुछ भी है, सही बात करने के लिए इस परिदृश्य में.

2021-11-23 16:54:58
1

के साथ अपने विकल्प के लिए, निम्न कोड है वास्तव में ठीक है:

@GetMapping
public void processData() {
    service.processData()
        .subscribeOn(Schedulers.boundedElastic())
        .subscribe();
}

यह वास्तव में है क्या आप में एक @Scheduled विधि है जो सिर्फ कुछ भी नहीं लौटाता और आप स्पष्ट रूप से करने के लिए सदस्यता लें Mono या Flux इतना है कि तत्वों उत्सर्जित कर रहे हैं.

2021-11-23 08:36:44

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

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

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

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में