반응형

[문제]

분명 Front-End 에서는 Back-End 로부터 Mono 데이터 하나를 받았는데 Promise 의 onComplete 이벤트가 발생하지 않았다. Front-End 의 코드와 Back-End 코드는 각각 다음과 같다.

 

async requestResponse(to: string, message: Message) {
    await this.connect();
    return new Promise((resolve, reject) => {
      this.client &&
        this.client.requestResponse(
          {
            data: cbor.encode(message),
            metadata: encodeRoute(to),
          },
          {
            onError: (error: Error) => {
              console.error('[*] oneToOne error : ', error);
              reject(error);
            },
            onNext: (payload: Payload, isComplete: boolean) => {
              console.log(
                `[*] oneToOne next : ${cbor.decode(
                  payload.data as Buffer,
                )} | ${isComplete}`,
              );
            },
            onComplete: () => {
              console.log('[*] 데이터 송신 완료');
              resolve(null);
            },
            onExtension: () => {},
          },
        );
    });
  }

 

RSocket 의 requestResponse 프로토콜로 서버에 데이터를 전송하고 받는 코드이다.

그런데 onNext 만 이벤트가 발생하고 onComplete 가 발생하지 않는 것이다.

 

@MessageMapping("chat.send")
public Mono<Boolean> sendChatMessage(@Payload Message messageRequest) {
    return chatRoomRepository.saveMessage(
            messageRequest.getRoomId(),
            messageRequest.getFromPerson(),
            messageRequest.getMessage()).log();
}

 

서버코드는 간결하다.

redis 에 데이터를 저장하고 결과 값을 Boolean 형태로 전송한다.

 

[원인]

 

Mono onComplete order is confusing · Issue #1752 · reactor/reactor-core (github.com)

 

Mono onComplete order is confusing · Issue #1752 · reactor/reactor-core

Expected behavior Following code: Mono.just("outer") .then(Mono.just("inner").doOnTerminate(() -> System.out.println("Completed inner mono."))) .doOnTerminate(() -&...

github.com

 

 

중간 부분 댓글을 보면 Mono.subscribe 를 호출할 때, onComplete 이벤트는 발생하지 않고 onNext 가 그 역할까지 대신한다는 내용이 보인다. onComplete 를 호출하지 않고 onNext 에서 끝낸다는 것이다.

 

클라이언트 코드에서 onComplete 일 때 resolve 함수를 호출하므로 onNext 에서 resolve 함수를 호출하여 문제를 해결하였다.

반응형

+ Recent posts