В документации 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);
}
- Этот redisClient должен сблизиться после блока try-with-resouce, но он все еще работает (получает подписанные события).Как?
- По умолчанию размер пула равен 8. Я могу установить n, но в итоге у меня будет n + 1 веб-сокет.Каков наилучший способ справиться с этим?Должен ли я иметь только один экземпляр Jedis и самостоятельно выполнять маршрутизацию сообщений?
- Если Jedis-клиент отключается, то каков здесь рекомендуемый способ повторного подключения?