Использование Jedis из пула соединений для PubSub - PullRequest
0 голосов
/ 08 июня 2018

В документации Jedis указано, что клиент Jedis не является поточно-ориентированным.

Один экземпляр Jedis не является поточно-безопасным!

Так что яЯ использую JedisPool.Я хочу отправить данные в клиент браузера WebSocket с сервера.Для этого я использую механизм Redis PubSub.

@ServerEndpoint(value = "/websocket/{channelName}", configurator = GetHttpSessionConfigurator.class)
public class WSEndpoint {

private WSJedisPubSub wsJedisPubSub;
private static JedisPool jedisPool = null;

@OnOpen
public void onOpen(Session session,
        @PathParam("channelName") String channelName) throws IOException,
        EncodeException {
    // FIXME proper synchronization is required here
    if (jedisPool == null) {
        initPool();
    }
    wsJedisPubSub = new WSJedisPubSub(session);
    try (Jedis redisClient = jedisPool.getResource()) {
        redisClient.subscribe(wsJedisPubSub, channelName);
    }

    private void initPool() {
        JedisPoolConfig jedisConfiguration = new JedisPoolConfig();
        jedisPool = new JedisPool(jedisConfiguration, "localhost", 6379);
    }
}

полный код

Мое приложение может иметь тысячи подключенных к нему веб-сокетов.У меня есть сомнения по поводу следующего фрагмента кода.

    try (Jedis redisClient = jedisPool.getResource()) {
        redisClient.subscribe(wsJedisPubSub, channelName);
    }
  1. Этот redisClient должен сблизиться после блока try-with-resouce, но он все еще работает (получает подписанные события).Как?
  2. По умолчанию размер пула равен 8. Я могу установить n, но в итоге у меня будет n + 1 веб-сокет.Каков наилучший способ справиться с этим?Должен ли я иметь только один экземпляр Jedis и самостоятельно выполнять маршрутизацию сообщений?
  3. Если Jedis-клиент отключается, то каков здесь рекомендуемый способ повторного подключения?
...