Scala 来自Redis客户端绝地的断管异常

Scala 来自Redis客户端绝地的断管异常,scala,playframework,redis,akka,jedis,Scala,Playframework,Redis,Akka,Jedis,我们有一个来自play framework应用程序的redis客户端调用。此Redis调用是由一名演员使用Akka Schedular进行的。这个调度程序每60秒运行一次,它与其他JDBC调用一起进行redis调用。调度程序运行几分钟后,我们开始在日志文件中看到以下内容,应用程序停止响应任何Redis客户端调用。这是我第一次接触Redis,因此任何指点,帮助都是非常感谢的 redis.host = localhost redis.port = 6379 redis.timeout = 10

我们有一个来自play framework应用程序的redis客户端调用。此Redis调用是由一名演员使用Akka Schedular进行的。这个调度程序每60秒运行一次,它与其他JDBC调用一起进行redis调用。调度程序运行几分钟后,我们开始在日志文件中看到以下内容,应用程序停止响应任何Redis客户端调用。这是我第一次接触Redis,因此任何指点,帮助都是非常感谢的

redis.host = localhost

redis.port = 6379

redis.timeout = 10

redis.pool.maxActive =110

redis.pool.maxIdle = 50

redis.pool.maxWait = 3000

redis.pool.testOnBorrow = true

redis.pool.testOnReturn = true

redis.pool.testWhileIdle = true

redis.pool.timeBetweenEvictionRunsMillis = 60000

redis.pool.numTestsPerEvictionRun = 10

Exception details:

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe
    at redis.clients.jedis.Connection.flush(Connection.java:69) ~[redis.clients.jedis-2.3.0.jar:na]
    at redis.clients.jedis.JedisPubSub.subscribe(JedisPubSub.java:58) ~[redis.clients.jedis-2.3.0.jar:na]
............    
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:498) [com.typesafe.akka.akka-actor_2.10-2.2.0.jar:2.2.0]
    at akka.actor.ActorCell.invoke(ActorCell.scala:456) [com.typesafe.akka.akka-actor_2.10-2.2.0.jar:2.2.0]
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:237) [com.typesafe.akka.akka-actor_2.10-2.2.0.jar:2.2.0]
    at akka.dispatch.Mailbox.run(Mailbox.scala:219) [com.typesafe.akka.akka-actor_2.10-2.2.0.jar:2.2.0]
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) [com.typesafe.akka.akka-actor_2.10-2.2.0.jar:2.2.0]
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [org.scala-lang.scala-library-2.10.3.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [org.scala-lang.scala-library-2.10.3.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [org.scala-lang.scala-library-2.10.3.jar:na]
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [org.scala-lang.scala-library-2.10.3.jar:na]
Caused by: java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.7.0_51]
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) ~[na:1.7.0_51]
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159) ~[na:1.7.0_51]
    at redis.clients.util.RedisOutputStream.flushBuffer(RedisOutputStream.java:31) ~[redis.clients.jedis-2.3.0.jar:na]
    at redis.clients.util.RedisOutputStream.flush(RedisOutputStream.java:223) ~[redis.clients.jedis-2.3.0.jar:na]
    at redis.clients.jedis.Connection.flush(Connection.java:67) ~[redis.clients.jedis-2.3.0.jar:na]
    ... 15 common frames omitted

问题在于超时,您用于订阅的客户端超时/被DC ed。我最近在Redis上遇到了类似的问题,问题是,订阅后我没有返回绝地资源,因此连接泄漏,并且应用程序在两次连接后没有响应。所以无论你做了什么,都别忘了归还绝地资源:

Jedis j = play.Play.application().plugin(RedisPlugin.class).jedisPool().getResource();
j.subscribe(listener, redisChannel);
play.Play.application().plugin(RedisPlugin.class).jedisPool().returnResource(j);

嗯,之前的超时设置是0。设置为0不意味着永不超时吗?我认为错误是由于0超时设置造成的,我们已将该设置更改为10秒(在redis客户端配置文件和redis服务器上),但这些错误是持久性的,会导致服务器停止。Jedis将超时时间视为毫秒而不是秒,所以您可能需要更改该设置。此文档称超时时间以秒为单位:。不正确?这是u通过redis.conf设置的超时,确实是以秒为单位的。但恰恰相反,我们的绝地构装师需要几毫秒,所以输入新绝地(“localhost”,637910000)需要10秒。