ยังไงเพื่อเปลี่ยเป็นโมโนให้เป็นอย่างแท้จริ asynchronous(ไม่ reactive!) วิธีการเรียก?

0

คำถาม

ฉันมีวิธีการ

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

อยู่ในที่ปกติโครงการไหลเวียนผมเรียกสิ่งนี้วิธีการ asynchronously ผ่านทาง Kafka เหตุการณ์.

สำหรับการทดสอบจุดประสงค์ฉันต้องการจะ เปิดโปงเรื่องสกปรกที่พววิธีการเป็นบริการเว็บแต่งวิธีควรจะเปิดเผยเป็น asynchronous:คืนเดียวที่ HTTP รหัส 200 โอเค("การร้องขอยอมรับ")และต่อข้อมูลการประมวลผลอยู่เบื้องหลัง

มันโอเค(=มันไม่มีการเสียเวลา-ผลข้างเคียง)เพื่อเรียก Mono#subscribe() และกลับมาจาก controller วิธีการ?

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

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

หรือเป็นมันดีกว่าต้องทำมันอย่างนี้(อยู่ที่นี่ฉันสับสนองโดยคำเตือนจาก IntelliJ บางทีเหมือนกับ 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

มันโอเค(=มันไม่มีการเสียเวลา-ผลข้างเคียง)เพิ่งจะโทรหาเสียงโมโน(mono)#บอกรับ()แล้วกลับมาจาก controller วิธีการ?

มันมีผลข้างเคียงแต่คุณอาจจะเป็นโอเคอยู่กับพวกเขา:

  • มันแท้จริงคือไฟและลืม-นั่นหมายถึงตอนที่คุณจะไม่มีวันนี้เพื่อให้มีการเตือนเมื่อเกี่ยวกับความสำเร็จ(ซึ่งส่วนใหญ่คนตระหนักถึง)คุณจะยังไม่ได้แจ้งเรื่องความล้มเหลว(ซึ่งห่างไกลคนน้อยกว่าที่เจ้าเห็น)
  • ถ้าระบวนการร่วสำหรับเหตุผลบางอย่างนั้นสำนักพิมพ์จะไม่มีวันสมบูรณ์แล้วคุณจะไม่มีทางรู้เลย ตั้งแต่คุณ subscribing บ bounded เปิด threadpool มันจะยังผูกขึ้นหนึ่งของพวกนั้นมีข้อจำกัดเธรดข่าวอย่างไม่มีวันจบสิ้นด้วย

ที่นี่คือจุดแรกที่คุณอาจจะไม่เป็นไรหรอนกับ,หรือคุณอาจต้องการบางอย่างเกิดข้อผิดพลาดการทำปูมบันทึกต่อไปลอง reactive โซ่ตอนเป็นด้านข้าง-ลูกเล่นบางอย่างงั้นคุณอย่างน้อยต้องการภายในการแจ้งให้ทราบถ้ามีอะไรผิดปกติ

สำหรับคนที่สองจุด-ฉันขอแนะนำให้ให้กา(ใจกว้าง)หมดเวลาของคุณวิธีการเรียกมันอย่างน้อยจะถูกยกเลิกถ้ามันยังไม่เสร็จสมบูรณ์ในตั้งเวลาและไม่ได้อยู่แถวกินทรัพยากร ถ้าคุณกำลังทำการ asynchronous งานแล้วนี่มันไม่ใช่ปัญหาใหญ่มากเธอเลือดไหลเยอะมากอย่างที่มันจะกินเวลานิดหน่อของหน่วยความจำจนหมดแล้ว ถ้าคุณห่อเป็นการปิดกั้นบอกเราเรื่องเปิดกำหนดชะตาชีวิตแล้วนี่มันแย่กว่าอย่างไรก็ตาม,ตามที่คุณกำมในการพยายามทำให้เชือกที่อยู่ในนั้น threadpool อย่างไม่มีวันจบสิ้น

อยางรวดเร็วที่สุดฉันก็ถามคำถามเหตุผลว่าทำไมฉันต้องใช้ bounded เปิดกำหนดชะตาชีวิตที่ทุกคนอยู่นี่-มันใช้สำหรับห่อบล็อกเขาก็บล็อกเรียซึ่งไม่เหมือนจะเป็นรากฐานของใช้คดี (งทำความเข้าใจกันหน่อยนะว่าถ้าบริการของคุณคือการปิดกั้นหลังจากนั้นเธอก็ต้องแน่นอนอยู่ห่อมันที่เปิดกำหนดชะตาชีวิต-แต่ถ้าไม่งั้นก็ไม่มีเหตุผลที่ต้องทำอย่างนั้น)

ในที่สุดนี้ตัวอย่าง:

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

...คือเป็นผู้หญิงที่ฉลาดงตัวอย่างของสิ่งที่ ไม่ ต้องทำอย่างที่คุณกำลังสร้างเหมือนกับ"ตัวปลอ reactive วิธีการ"-ใครบางคนอาจจะมาก reasonably บอกรับข่าวจากนั้นกลับมาสำนักพิมพ์ลังคิดว่ามันจะสมบูรณ์เมื่อตอนที่ underlying สำนักพิมพ์ completes ซึ่งเห็นได้ชัดว่าไม่มีอะไรเกิดขึ้นที่นี่ ใช้ void กลับประเภทและทำให้ไม่กลับมาทุกสิ่งทุกอย่างที่ถูกต้องที่ต้องทำอย่างในบทละครนี้หรอก

2021-11-23 16:54:58
1

ของคุณตัวเลือกด้วยการต่อรหัสเป็นจริงโอเค:

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

นี่คือที่จริงสิ่งที่คุณทำอยู่ @Scheduled วิธีที่ง่ายกลับไม่มีอะไรแล้วคุณในข้อบังคับบอกรับไปที่ Mono หรือ Flux ดังนั้นส่วนประกอบเป็น emitted.

2021-11-23 08:36:44

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่