Как остановить удаленный вызов Angular на поток Spring webflux - PullRequest
1 голос
/ 14 марта 2019

Я изучаю Spring webflux и Reactive Streams и попробовал сервис, который транслирует информацию из mongoDB.Проблема в том, что когда ничего не осталось отправить из MongoDB, Spring закрывает запрос.Так что я действительно хотел сделать: иметь в моем mongodb таблицу Angular, в которой отображаются данные, полученные SPRING, и каждый раз, когда производится обновление / вставка, при этом новые данные автоматически поступают в Angular.

Я нашел способ звонить в мою угловую службу каждые XXXX миллисекунд.

Есть ли другой способ сделать это?Так вот мой код веб-сервиса Spring:

@GetMapping(path="/stream/organisation",produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Organisation> streamAll() {
    return organisationRepository.findAll();
}

Мой сервис Angular:

getOrganisationStream(): Observable<Array<Organisation>> {
    this.Organisations = [];
    return Observable.create((observer) => {
            const eventSource = new EventSource(this.url);
            eventSource.onmessage = (event) => {
                // tslint:disable-next-line:no-console
                console.debug('Received event: ', event);
                const json = JSON.parse(event.data);
                console.log(json);
                const org: Organisation = new Organisation();
                org.codeFase = json.codeFase;
                org.id = json.id;
                org.name = json.name;
                this.Organisations.push(org);
                console.log(this.Organisations.length);
                this.ngZone.run(() => {
                    observer.next(this.Organisations);
                });
            };
            eventSource.onerror = (error) => {
                if (eventSource.readyState === 0) {
                console.log('The stream has been closed by the server.');
                eventSource.close();
                observer.complete();
            } else {
                observer.error('EventSource error: ' + error);
            }
        };
    });
}

Мой компонент:

organisations: Observable<Organisation[]>;
constructor(private testService: TestService) {
}
ngOnInit(): void {
    this.organisations = this.testService.getOrganisationStream();
}

Мой HTML:

   <div *ngFor="let org of organisations | async"> 
{{org.name}} {{org.codeFase}}
</div>

1 Ответ

0 голосов
/ 14 марта 2019

Вам нужно будет использовать настраиваемый курсор это бесконечный поток, он остается открытым до тех пор, пока не будет закрыт снаружи.

В вашем хранилище сделайте что-то вроде:

@Tailable
Flux<Organisation> findAll();

Курсор будет закрыт при отмене подписки, в вашем случае, когда клиент закрывает соединение.

...