I am writing a web app where multiple listeners(Evcentsource SSE clients JS) will be connected to my server . what i want to do is
If you want the sseEmmiter available open for infinite time, you can simply set the time out to -1L
and to send events selectively put all of sseEmmiters in a map with specific key to use it when you want to send event like i did in this code .
@Controller
@RequestMapping(path = "api/person")
public class PersonController {
@Autowired
private PersonRepository personRepository;
private Map<String, SseEmitter> onPersonAddedSseEmitters = new ConcurrentHashMap<>();
@PostMapping(path = "/add")
public @ResponseBody
String addPerson(@RequestBody Person person) {
person.setId(new Random().nextLong());
personRepository.save(person);
onPersonAddedSseEmitters.forEach((key, sseEmitter) -> {
try {
if (person.getName().startsWith(key.split("-")[0])) {
sseEmitter.send(person);
}
} catch (Exception ignored) {
sseEmitter.complete();
onPersonAddedSseEmitters.remove(key);
}
});
return "Saved";
}
@GetMapping(path = "/onPersonAdded/{prefix}")
public SseEmitter onPersonAdded(@PathVariable String prefix) {
SseEmitter sseEmitter = new SseEmitter(-1L);
onPersonAddedSseEmitters.put(prefix + "-" + new Random().nextLong(), sseEmitter);
return sseEmitter;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With