Redis中Jedis版本升級後的問題總結

來源:互聯網
上載者:User


最近因為jedis 2.1.0介面的一些問題,升級版本了版本,結果出現了一個詭異的問題;時常能正常啟動,時常出現jedisPool初始化時 java.lang.IllegalArgumentException: hostname can’t be null

原因出在spring JedisPool構造參數上,之前spring的配置如下

<bean id="jedisPool" class="redis.clients.jedis.JedisPool">     <constructor-arg ref="jedisConfig" />    <constructor-arg value="${redis.host}" />    <constructor-arg type="int" value="${redis.port}" /></bean>
明顯是因為host沒有注入,但時常又可以,詭異!!!之後弄了jedis源碼,加了日誌,才定位到原因,查看JedisPool源碼,其中的兩建構函式如下
public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, final int port) { this(poolConfig, host, port, Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, null);} public JedisPool(final GenericObjectPoolConfig poolConfig, final URI uri, final int timeout) { super(poolConfig, new JedisFactory(uri.getHost(), uri.getPort(), timeout,    JedisURIHelper.getPassword(uri), JedisURIHelper.getDBIndex(uri) != null ?      JedisURIHelper.getDBIndex(uri) : 0, null));}
我們調用的是第一個建構函式,但事實是可能會調用第二個建構函式;port當做了timeout,host當做了URI。

不是很明白spring為什麼會把value是字串的參數匹配到URI上,那就明確指定類型吧

<bean id="jedisPool" class="redis.clients.jedis.JedisPool">     <constructor-arg ref="jedisConfig" />    <constructor-arg type="java.lang.String" value="${redis.host}" />    <constructor-arg type="int" value="${redis.port}" /></bean>

jedis之前的異常為,方面遇到同問題的同學

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool        at redis.clients.util.Pool.getResource(Pool.java:50)        at redis.clients.jedis.JedisPool.getResource(JedisPool.java:88)        at com.renhenet.modules.redis.RedisService.getHash(RedisService.java:364)        at com.renhenet.modules.member.MemberRedisService.getMemberIndustryByMemberId(MemberRedisService.java:240)        at com.renhenet.modules.member.MemberService.getMemberIndustry(MemberService.java:236)        at com.renhenet.modules.member.MemberService$$FastClassByCGLIB$$b34212a.invoke(<generated>)        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)        at com.renhenet.modules.member.MemberService$$EnhancerByCGLIB$$1638ea72.getMemberIndustry(<generated>)        at com.renhenet.fw.struts2.interceptor.LoginRenheInterceptor.intercept(LoginRenheInterceptor.java:68)        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)        at com.renhenet.fw.struts2.interceptor.WebRenheInterceptor.intercept(WebRenheInterceptor.java:27)        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)        at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)        at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)        at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)        at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)        at com.renhenet.fw.struts2.filter.RenheStruts2Filter.doFilter(RenheStruts2Filter.java:32)        at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87)        at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:187)        at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:265)        at com.caucho.server.hmux.HmuxRequest.handleRequest(HmuxRequest.java:436)        at com.caucho.server.port.TcpConnection.run(TcpConnection.java:682)        at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:730)        at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:649)        at java.lang.Thread.run(Thread.java:745)Caused by: java.lang.IllegalArgumentException: hostname can't be null        at java.net.InetSocketAddress.checkHost(InetSocketAddress.java:149)        at java.net.InetSocketAddress.<init>(InetSocketAddress.java:216)        at redis.clients.jedis.Connection.connect(Connection.java:142)        at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:75)        at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1572)        at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:69)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.