Cum de a transforma un Mono într-un adevărat asincron (nu reactive!) apel de metodă?

0

Problema

Am o metoda

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

În program normal de curgere, eu numesc această metodă asincron prin intermediul unui Kafka eveniment.

Pentru testare am nevoie pentru a expune metoda ca un serviciu web, dar metoda ar trebui să fie expuse ca asincron: revenind doar codul HTTP 200 OK ("cerere acceptată") și continuând cu prelucrarea datelor în fundal.

Este OK (= nu au nici efecte secundare nedorite) doar pentru a apela Mono#subscribe() și de a reveni de la operator metoda?

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

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

Sau este mai bine să facă așa (aici sunt confuz de avertizare de IntelliJ, poate la fel ca 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();
}

Sau o alta solutie?

2

Cel mai bun răspuns

3

Este OK (= nu au nici efecte secundare nedorite) doar pentru a apela Mono#mă abonez() și retur de la operator metoda?

Există efecte secundare, dar poate fi ok trai cu ele:

  • Acesta este cu adevărat de foc și uitați - ceea ce înseamnă că în timp ce niciodată nu vei fi notificat despre un succes (pe care cei mai mulți oameni dau seama), de asemenea, veți fi notificat despre un eșec (pe care mult mai puțini oameni dau seama.)
  • Dacă procesul se blochează pentru un motiv oarecare, acea persoana nu se va finaliza, și veți avea nici o modalitate de a ști. Când ești abonarea pe delimitate elastic threadpool, va lega, de asemenea, unul dintre cei limitat fire pe termen nelimitat prea.

Primul punct s-ar putea fi bine, sau poate vrei sa pui o eroare de logare de mai jos care reactive lanț ca un efect secundar, cumva, așa că cel puțin o notificare internă dacă ceva nu merge bine.

Pentru al doilea punct - aș recomanda să o (generos) timeout pe metoda numesc așa că, cel puțin, va fi anulată dacă nu s-a finalizat într-un timp stabilit, și nu mai este agățat în jurul valorii de consumatoare de resurse. Dacă sunteți execută o sarcină asincron, atunci acest lucru nu este o problemă masivă ca va consuma doar un pic de memorie. Dacă ești un ambalaj apel de blocare pe elastic scheduler, atunci acest lucru este mai rău, cu toate acestea, după cum legi un fir în care threadpool pe termen nelimitat.

Am, de asemenea, întrebarea de ce aveți nevoie pentru a utiliza delimitate elastic scheduler la toate aici - este folosit pentru ambalaj blocarea apelurilor, care nu pare să fie fundamentul acest caz de utilizare. (Să fie clar, dacă serviciul dvs. se blochează atunci ar trebui să absolut folie pe elastic scheduler - dar dacă nu, atunci nu există nici un motiv să facă acest lucru.)

În cele din urmă, acest exemplu:

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

...este un exemplu strălucit de ceea ce nu face, ca esti creând un fel de "impostor reactive metodă" - cineva ar putea în mod rezonabil mă abonez la care a revenit persoana gândindu-se că va finaliza când de fond al sistemului persoana completeaza, care, evident, nu este ceea ce se întâmplă aici. Folosind un void tipul de retur și, astfel, nu se întoarce nimic este corect să facem în acest scenariu.

2021-11-23 16:54:58
1

Opțiunea dumneavoastră cu următorul cod este de fapt ok:

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

Aceasta este de fapt ceea ce faci într-o @Scheduled metoda care pur și simplu se întoarce nimic și nu în mod explicit să mă abonez la Mono sau Flux așa că elemente sunt emise.

2021-11-23 08:36:44

În alte limbi

Această pagină este în alte limbi

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