1 सवाल: स्प्रिंग वेबफ्लक्स का उपयोग करते समय प्रतिक्रिया देते समय पृष्ठभूमि में एक मोनो चलाना

पर बनाया गया सवाल Tue, Apr 9, 2019 12:00 AM

यह प्रश्न वसंत वेब फ़्लर्ट में तुरंत वापस से संबंधित है लेकिन मैं ऐसा मत सोचो कि यह समान है (कम से कम उत्तर मेरे लिए संतोषजनक नहीं है)।

मेरे पास Mono पर वापस लौटा एक फ़ंक्शन है, जब आह्वान एक लंबे समय से चलने वाला काम शुरू करता है। स्प्रिंग वेबफ्लक्स HTTP एपीआई पर कॉल करने पर यह फंक्शन आ जाता है। यहाँ एक उदाहरण है:

@PutMapping("/{jobId}")
fun startNewJob(@PathVariable("jobId") jobId: String,
                request: ServerHttpRequest): Mono<ResponseEntity<Unit>> {
    val longRunningJob : Mono<Job> = startNewJob(jobId)
    longRunningJob.map { job ->
        val jobUri = generateJobUri(request, job.id)
        ResponseEntity.created(jobURI).build<Unit>()
    }
}

ऊपर दिए गए कोड के साथ समस्या यह है कि "201 Created" बनाया गया है लंबे समय तक चलने वाला काम पूरा हो गया है। मैं बैकग्राउंड में longRunningJob को किक-ऑफ करना चाहता हूं और "201 क्रिएटेड" को तुरंत लौटा दूंगा।

मैं शायद ऐसा कुछ कर सकता था:

@PutMapping("/{jobId}")
fun startNewJob(@PathVariable("jobId") jobId: String,
                request: ServerHttpRequest): Mono<ResponseEntity<Unit>> {

    startNewJob(jobId)
        .subscribeOn(Schedulers.newSingle("thread"))
        .subscribe()

    val jobUri = generateJobUri(request, job.id)
    val response = ResponseEntity.created(jobURI).build<Unit>()
    Mono.just(response)
}

लेकिन मेरे लिए subscribe() पर कॉल करना बहुत मुहावरेदार नहीं लगता (उदाहरण के लिए intellij शिकायत कर रहा है कि मैं subscribe() को नॉन-ब्लॉकिंग स्कोप में कहता हूं)। क्या एक स्पष्ट subscribe का उपयोग किए बिना दो "धाराओं" की रचना करने का कोई बेहतर तरीका नहीं है? यदि हां, तो मैं इसे प्राप्त करने के लिए ऊपर दिए गए startNewJob फ़ंक्शन को कैसे संशोधित करूं?

    
0
1 उत्तर                              1                         

AFAIK, subscribe तरीकों में से एक का उपयोग करना वास्तव में अपने स्वयं के जीवनचक्र के साथ पृष्ठभूमि में नौकरी शुरू करने का एकमात्र तरीका है (लौटे प्रकाशक से बंधा हुआ नहीं)।

यदि आप जॉब पब्लिशर और रेस्पॉन्स पब्लिशर (जैसे 0600350991111010010350 या 0600350991100101035062) को जॉइन करने के लिए किसी एक ऑपरेटर का इस्तेमाल कर रहे थे, तो जॉब के लाइफसाइकल को रिस्पांस पब्लिशर से जोड़ दिया जाएगा, जो आप के लिए नहीं है। एक पृष्ठभूमि नौकरी।

एक बात जिस पर आप विचार करना चाह सकते हैं, वह है किकिंग ऑफ बैकग्राउंड जॉब के भीतर बैकग्राउंड जॉब, बजाय सीधे मेथड बॉडी के। जैसे zip के माध्यम से या प्रतिक्रिया के अपस्ट्रीम ऑपरेटर से।

यह बैकग्राउंड जॉब की शुरुआत को रिस्पांस पब्लिशर की घटनाओं को ऑनबस करने के लिए टाई करेगा, लेकिन फिर भी इसे बैकग्राउंड में पूरा करने की अनुमति देगा।

यह भी ध्यान दें, कि यदि आप पृष्ठभूमि की नौकरी को रद्द करना चाहते हैं (उदाहरण के लिए, आवेदन बंद होने के दौरान), तो आपको merge पर 0600350991111001010350 पर लौटाए गए 06003509911001010350 पर सहेजना होगा ताकि आप बाद में इस पर doOnSubscibe पर कॉल कर सकें। यह कुछ प्रकार के बैकग्राउंडजोबमैन से बेहतर हो सकता है जो सभी नौकरियों को चलाने का ट्रैक रख सके।

    
2
2019-04-12 22: 36: 39Z
Disposable
स्रोत रखा गया यहाँ