ReactiveRedisMessageListenerContainer.receive не работает в первый раз, но имеет еще одного слушателя после - PullRequest
0 голосов
/ 21 марта 2020

Это очень странно, я создаю свой компонент следующим образом:

@Bean
public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) {
    Config config = new Config();
    config.useSingleServer().setAddress("redis://"+host+":"+port);
    return new RedissonConnectionFactory(config);
}


@Bean
public ReactiveRedisMessageListenerContainer topicListener(RedissonConnectionFactory redissonConnectionFactory) {
    return new ReactiveRedisMessageListenerContainer(redissonConnectionFactory);
}

Затем в моем контроллере:

@GetMapping(path = {"/register/"}, produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> registerToEvents() throws IOException {
    return topicListener.receive(channel).map(message -> {
        return ServerSentEvent.<String> builder().data(message.getMessage()).build();
    }
            );  
}

Факт в том, что клиент впервые открывает соединение по подписке. не будет работать. Тогда последующая подписка будет работать правильно. Другой факт заключается в том, что общее число подписчиков всегда равно n + 1, это похоже на то, что первая подписка вызывает что-то и с этого момента оно остается там.

...