Я пытаюсь отправить сообщение подключенным клиентам с помощью SSE.
Я сохранил объект SseEmitter в redis, чтобы получить его и отправить сообщение клиенту.
Но сообщение не отправляется клиенту.
Когда я тестировал простой список, он работал нормально. Но когда у меня несколько клиентов, мне нужно сохранить информацию о подключении соответствующих клиентов и отправить сообщение. Но сообщение не отправляется.
У меня есть класс контроллера с двумя конечными точками, / subscribe / {userId] для подписки на сообщения SSE и другое событие dispatchEvent для отправки сообщений с сервера клиенту.
В моем обработчике метода подписки у меня есть, как показано ниже,
@CrossOrigin
@RequestMapping(value = "subscribe/{userId}", consumes=MediaType.ALL_VALUE)
public SSEInfo subscribe(@PathVariable("userId") String userId) {
SSEInfo sseEmitter=new SSEInfo(Long.MAX_VALUE);
try {
sseEmitter.send(SseEmitter.event().name("INIT"));
sseRedisService.save(userId,sseEmitter);
}catch(IOException e) {
e.printStackTrace();
}
sseEmitter.onCompletion( () -> sseRedisService.deleteById(userId));
sseRedisService.save(userId,sseEmitter);
return sseEmitter;
}
В моем обработчике dispatchEvent, как показано ниже,
@PostMapping(value = "dispatchEvent")
public void dispatchEventsToAllClients(@RequestParam String event,@RequestParam String userId) {
try {
SSEInfo sseEmitter=(SSEInfo) sseRedisService.findById(userId);
sseEmitter.send(SseEmitter.event().name("event").data(event));
} catch (IOException e) {
e.printStackTrace();
sseRedisService.deleteById(userId);
}
}
Внутри объекта sseRedisService моего класса обслуживания SSERedisService я использую Redis данных Spring,
redisTemplate.opsForValue().set(userId,object); to save in redis cache.
Для получения я использую,
redisTemplate.opsForValue().get(userId);
Но сообщения не отправляются клиенту, когда я вызываю событие отправки.
Я обернул SseEmitter, создав собственный класс SSEInfo, который расширяет SseEmitter и реализует Serializable.
Я использую следующие запросы CURL,
curl http://localhost:8085/subscribe/user001
curl -d "event=teeuser&userId=user001" -X POST http://localhost:8085/dispatchEvent
для подписки и отправки событий соответственно.
Может кто-нибудь помочь мне с проблемой. Я не уверен, сможем ли мы сохранить объект sseEmitter в redis и получить его снова, чтобы отправить обратно клиентам.
Полный исходный код также доступен в репозитории github, как показано ниже,
https://github.com/sri420/SSE-Redis
Может кто-нибудь помочь с этой проблемой.




Вам удалось найти обходной путь? Я экспериментирую с тем же, и кажется, что spring не может поддерживать http-соединение, пробовал его использовать в списке памяти, он работает