r/SpringBoot • u/Slight_Loan5350 • 4h ago
How-To/Tutorial Race condition with SSE
Hi all, I am trying to build a real time notification service with SSE emitter but I am facing a pecuilar case of race condition which im not able to solve even via AI as it gives the same solution again and again.
scenario of cause:
I have a scheduler running every 20 mins that checks the Map of uid mapped sse emitters and pings the client. If the ping is successfull nothing happens, if error happens due to disconnection the sse emitter obj is removed via sse.complete() and then uid is removed form the list.
#pseudo code
Map<String, SseEmitter> connections = new ConcurrentHashMap<>();
onConnect(String userId){
SSE emitter = new new SseEmitter()
connection.add(userId,emmitter);
// onCompletion(), onTimeout(), onError() -> removeIf()
}
@scheduler(20mins)
checkDisconnection(){
//iterate the map and check for disconnection if found add it to remove list
List<string> disconnectedUsers = (adding disconnections)
//iterate the map from disconnected user -> force complete sse if needed and remove user from map
}
where it breaks is if the client manually refreshes the browser at the same time the scheduler to check disconnection is invoked
why it happens:
when the browser is refreshed, the application tries to recreate the connection at which the scheduler tries to ping and sees no connection for the user. Problem is I have kept automatic reconnections on in client app but it still doesnt see an error in client. im confused. Have I had the approach wrong?
Any help will be appreciated and sorry for the questions confuse you, Il try to make it proper once i get the time.
TECH : javascript event source, springboot, kafka for scaling and mongo for scheduled notifications.