를 설정하는 방법 모노로 진정으로 비동기(반응하지 않습니다!) 메소드 호출은?

0

질문

나는 방법

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

일반 프로그램에서류,내가 이 메소드를 호출을 통해 비동기적으로는 카프카의 이벤트입니다.

테스트를 위해 필요가 노출 방법으로 웹 서비스,그러나 방법에 노출되어야으로 비동기:만 반환 HTTP 코드 200OK(요청"accepted")그리고 계속 데이터 처리에서 배경입니다.

그것은 확인(=지 않는 그것을 원하지 않는 부작용)전화하기 Mono#subscribe() 고에서 반환 컨트롤러 방법이 있나요?

@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

그것은 확인(=지 않는 그것을 원하지 않는 부작용)다만 전화를 모노#구독()에서 반환 컨트롤러 방법이 있나요?

부작용이 있다,하지만 당신은 수 있습 ok 그들과 함께 생활:

  • 그것은 진정으로 화재 및 잊을 의미하는 동안 당신에 대해 통보공(는 대부분의 사람들을 깨닫),당신은 또한 결코 통지에 대한 실패(는 훨씬 적은 사람들이 실현.)
  • 는 경우 프로세스 중단을 위한 어떤 이유로 게시자가 완전하지 않을,그리고 당신은 당신의 방법을. 있기 때문에 가입된 탄성 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 방법은 단순히 아무것도 반환하고 당신이 명시적으로 가입 MonoFlux 도록 요소가 방출됩니다.

2021-11-23 08:36:44

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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