2015-09-07 4 views
2

я использовать Redis для аутентификации в сервлет фильтр, и я не модифицируется redis.confJedis сломаны исключение трубы

jedis = new Jedis("localhost"); 
String authToken = jedis.get(uid); 

Строка 2 генерирует исключение.

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe 
redis.clients.jedis.Connection.flush(Connection.java:291) 
redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:214) 
redis.clients.jedis.Connection.getBulkReply(Connection.java:205) 
redis.clients.jedis.Jedis.get(Jedis.java:105) 
filter.AuthFilter.doFilter(AuthFilter.java:38) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

ответ

0

Ссылка на GET for Redis документ:

возвращается ошибка, если значение хранится в ключе не является строкой, поскольку GET только обрабатывает значения строк.

Итак, uid является строковым типом?

2

Соединение, кажется, сбрасывается/отключается. Это может произойти, если вы используете долгоживущее соединение (например, подключитесь к Redis при запуске приложения, а затем используйте соединение снова и снова).

Возможных решений:

  1. Используйте JedisPool, чтобы получить соединение, когда это необходимо и вернуть его после использования его
  2. переподключения, если соединение разорвано (необходимо попробовать/поймать магию, чтобы предотвратить, что ошибки распространяются к приложению логики)
  3. Connect на данный момент вам необходимо подключение и отключение после

Есть также Java Redis Кли которые обеспечивают прозрачное повторное соединение, что вы никогда не увидите исключение сокета (lettuce, redisson).

 Смежные вопросы

  • Нет связанных вопросов^_^