我正在学习Spring webflux和Reactive Streams,并尝试了一种从mongoDB流信息的服务。 问题是,当MongoDB没有任何东西要发送时,Spring关闭请求。 所以我真正想做的是: 在我的mongodb中有一个Angular表,显示通过SPRING检索的数据,并且每次进行更新/插入时,新数据都会自动发送到Angular。
我发现的唯一方法是每隔XXXX毫秒调用一次我的角度服务。
还有其他方法吗? 这是我的Spring Web服务代码:
@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>
答案 0 :(得分:0)
您将需要使用tailable cursor,这是一个无限流,它将保持打开状态,直到从外部关闭为止。
在您的存储库中执行以下操作:
@Tailable
Flux<Organisation> findAll();
如果放弃客户端,则在关闭订阅时,光标将关闭。