2017-11-23 16 views
1

Spring WebFlux를 사용하여 오류 처리를 구현하는 방법에 대한 좋은 예제를 찾기 위해 고심하고 있습니다.Spring WebFlux Broken Stream 오류 처리

처리하려는 사용 사례는 스트림이 예기치 않게 종료되었음을 HTTP 클라이언트에 알리는 것입니다. 무엇을 찾았는지 상자 밖의 동작으로, 스트림이 종료되었을 때, 예를 들어 x 항목이 처리 된 후 RuntimeException을 발생시키는 것이 너무 우아하게 처리되었음을 알게되었습니다. 클라이언트는 예외가 발생할 때까지 모든 항목을 플러시 한 다음 연결을 닫습니다. 고객이 염려하는 한 요청이 성공적이었습니다. 다음 코드는 방법을 보여줍니다이되었습니다 설정 :

public Mono<ServerResponse> getItems(ServerRequest request) { 

     Counter counter = new Counter(0); 

     return ServerResponse 
       .ok() 
       .contentType(MediaType.APPLICATION_STREAM_JSON) 
       .body(operations.find(query, Document.class, "myCollection") 
         .map(it -> { 
          counter.increment(); 
          if(counter.getCount() > 500) { 
           throw new RuntimeException("an error has occurred"); 
          } 
          return it; 
         }), Document.class); 

} 

스트림이 예기치 않게 종료하는 HTTP 클라이언트 오류를 ​​처리하고 알리기 위해 권장되는 방법은 무엇입니까?

답변

1

정말 그 실패를 클라이언트에 알리는 방법에 달려 있습니다. 클라이언트가 특정 오류 메시지를 표시해야합니까? 클라이언트가 자동으로 다시 연결해야합니까?

스트림에 기록하지 못하게하는 "비즈니스 오류"인 경우 특정 이벤트 유형 (서버 보낸 이벤트 스펙 참조)을 사용하여 해당 실패를 알릴 수 있습니다.

스프링 WebFlux는 이벤트, ID, 설명 및 데이터 (실제 데이터)와 같은 다양한 필드를 제어 할 수있는 ServerSentEvent<T>을 지원합니다. Flux::onErrorMap 연산자를 사용하면 "error" 이벤트 유형 (자세한 내용은 ServerSentEvent.builder() 참조) 인 ServerSentEvent을 작성할 수 있습니다.

그러나 이것은 특정 이벤트에 가입하고 JavaScript 코드를 변경해야하기 때문에 클라이언트에게는 투명하지 않습니다. 그렇지 않으면 오류 메시지가 일반 메시지로 표시 될 수 있습니다.

+0

회신 지연에 사과드립니다. 백엔드 mongo 서버 연결이 끊어지는 경우 클라이언트에게 오류가 발생했다는 것을 알리고 구성대로 다시 시도 할 수 있기를 원합니다. 비 반응 시스템에서는 500 개의 상태 코드와 통신했을 수 있습니다. 이 시나리오에서 서버에서 보낸 이벤트를 다시 추천하고 오류 이벤트가 펌핑되기 전에 스트림이 닫히지 않는 오류가 있습니까? – Ellis

+0

요구 사항을 더 자세히 설명 했으므로 제안 된 한 가지 해결책은 후행 HTTP 헤더를 사용하여 성공 또는 실패를 알리는 것입니다. 스트림 완료 또는 오류 발생시 WebFlux를 사용하여 이러한 기능을 설정할 수있는 메커니즘이 있습니까? – Ellis

+0

현재, Spring WebFlux에서는 후행 헤더가 지원되지 않습니다. 처음에 SSE와 호환되는지는 모르겠습니다. –