diff --git a/spring-boot-admin-server-ui/src/main/frontend/store.spec.ts b/spring-boot-admin-server-ui/src/main/frontend/store.spec.ts index a51f389f46a..95f7de25b29 100644 --- a/spring-boot-admin-server-ui/src/main/frontend/store.spec.ts +++ b/spring-boot-admin-server-ui/src/main/frontend/store.spec.ts @@ -79,6 +79,27 @@ describe('store', () => { expect(removedListener).not.toHaveBeenCalled(); }); + it('does not replace an application with an older status update', async () => { + mockSubject.next({ + data: { + ...registerWithOneInstance, + status: 'DOWN', + statusTimestamp: '2022-12-19T10:07:21.646905Z', + }, + }); + mockSubject.next({ + data: { + ...registerWithOneInstance, + status: 'UP', + statusTimestamp: '2022-12-19T10:07:20.646905Z', + }, + }); + + await waitFor(() => { + expect(applicationStore.applications[0].status).toBe('DOWN'); + }); + }); + it('deregisters an instance', async () => { mockSubject.next({ data: registerWithTwoInstances }); mockSubject.next({ data: registerWithOneInstance }); diff --git a/spring-boot-admin-server-ui/src/main/frontend/store.ts b/spring-boot-admin-server-ui/src/main/frontend/store.ts index 3d44804ec86..6d7f23d16f2 100644 --- a/spring-boot-admin-server-ui/src/main/frontend/store.ts +++ b/spring-boot-admin-server-ui/src/main/frontend/store.ts @@ -122,6 +122,15 @@ export default class ApplicationStore { updateApplication(application: Application) { const oldApplication = this._applications.get(application.name); + if ( + oldApplication && + oldApplication.statusTimestamp && + application.statusTimestamp && + new Date(application.statusTimestamp) < + new Date(oldApplication.statusTimestamp) + ) { + return; + } if (!oldApplication && application.instances.length > 0) { this._applications.set(application.name, application); this._dispatchEvent('added', application);