2013-02-21 46 views
9

Mam problemy sporządzenie .hgetall, oto co próbowałem:Konfiguracja Jedis Timeout

Jedis jedis = new Jedis(REDIS_MASTER_NODE); 
    jedis.connect(); 
    jedis.configSet("timeout", "30"); 

    Map<String, String> alreadyStored = jedis.hgetAll(redisTargetHash); 

i oto co mam:

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out 
    at redis.clients.jedis.Protocol.process(Protocol.java:79) 
    at redis.clients.jedis.Protocol.read(Protocol.java:131) 
    at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:199) 
    at redis.clients.jedis.Jedis.hgetAll(Jedis.java:851) 

Ok,

Jedis jedis = new Jedis(REDIS_MASTER_NODE, 6379, 1800); 

zrobiłem to.

Odpowiedz

13

Jeśli to, co chcesz zrobić, to ustawić Jedis limitu czasu połączenia, powinien to zrobić za pomocą specjalnego konstruktora wykonany za to:

public Jedis(final String host, final int port, final int timeout) 

Co robisz jest ustawienie limitu czasu na ustawieniach Redis z jedis. Wykonanie CONFIG SET timeout 60 oznacza, że ​​redis zamknie bezczynne połączenia klienta po 60 sekundach. Właśnie dlatego dostajesz wyjątek w Jedis.

+4

jest to limit czasu oczekiwania na połączenie lub odczyt z gniazda. – Trying

+5

Co to jest jednostka czasu oczekiwania? Jak w to jest w sekundach lub milisekundach? –

+0

@xetorthio czy możesz mi powiedzieć, jak mogę określić limit czasu zapytania w jedis? Obecnie używam 'jedis-2.6.0.jar' Proszę również powiedzieć mi, jakie są domyślne wartości z nich. Zgodnie z moim rozumieniem 'connectionTimeout' jest nowym połączeniem ustanawiającym limit czasu. –

5

To jest trochę rozszerzenie odpowiedzi Xetorthio, ale tutaj jest podobne podejście do użycia z JedisPool. (Niestety, to jest na podstawie mojego zrozumienia od patrzenia na Jedis wersji 2.6.2 kod bezpośrednio i nie zostały przetestowane w przypadku żywego użytku.)

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 
    jedisPoolConfig.setMaxWaitMillis(writeTimeout); 
    JedisPool pool = new JedisPool(jedisPoolConfig, redisHost, port, readTimeout); 

writeTimeout wynosi maksymalnie czas dla zasobu Jedis od puli, aby poczekać na operację zapisu.

Wartością parametru readTimeout określoną dla konstruktora puli jest czas oczekiwania na odczyt gniazda, patrz java.net.Socket.setSoTimeout w celu uzyskania bardziej szczegółowych informacji.

+0

dla mnie. Dziękuję bardzo.. –

1

kilka rzeczy do rozważenia:

  1. Dla obu Jedis i klas JedisPool, czas oczekiwania w milisekundach. Domyślny limit czasu, przynajmniej w 2.5.1, jak widzę, jest 2000 (milisek): int redis.clients.jedis.Protocol.DEFAULT_TIMEOUT = 2000 [0x7d0]

  2. Zgodnie this dokumentacji, najnowsza wersja Redis nie zamyka połączenie, nawet jeśli klient jest bezczynny. Nie zweryfikowałem jeszcze tego, a postaram się zaktualizować wpis, gdy to zrobię.