Невозможно отправить сообщение с помощью SSE подключенным клиентам

Я пытаюсь отправить сообщение подключенным клиентам с помощью 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-соединение, пробовал его использовать в списке памяти, он работает

DarkMakukudo 06.04.2021 14:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
1
81
0

Другие вопросы по теме