adi*_*dar 4 java spring server-sent-events eventemitter
我正在编写一个 Web 应用程序,其中多个侦听器(Evcentsource SSE 客户端 JS)将连接到我的服务器。我想做的是
您需要在 SseEmitter 上设置超时。默认超时时间相当短。
该SseEmitter超时的单位是毫秒。这是会话超时,不受会话活动的影响。
超时需要设置为会话的预期持续时间,以毫秒为单位。所以,86400000(或更多)是完全合适的。
小智 5
如果您希望 sseEmiter 可以无限次打开,您可以简单地将超时设置为 -1L
并有选择地发送事件,将所有 sseEmmiters 放入具有特定键的映射中,以便在您想像我在此代码中所做的那样发送事件时使用它。
@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;
}
}
Run Code Online (Sandbox Code Playgroud)