使用redis做一次投票活动中tomcat 启动一段时间后死机redis.clients.jedis.exceptions.JedisDataException: value sent to redi

来源:互联网 发布:剑雨江湖进阶数据2017 编辑:程序博客网 时间:2024/06/05 15:08

一个微信投票活动中项目扔tomcat中跑起来 ,后来投票后不间断老司机,当时十分费解  ,小项目没用日志略坑,只能查看tomcat日志,于是看到日志记录报错如下

Jun 17, 2017 7:52:53 AM org.apache.catalina.core.StandardWrapperValve invokeSEVERE: Servlet.service() for servlet [SpringMVC] in context with path [/lx] threw exception [Request processing failed; nested exception is redis.clients.jedis.exceptions.JedisDataException: value sent to redis cannot be null] with root causeredis.clients.jedis.exceptions.JedisDataException: value sent to redis cannot be nullat redis.clients.util.SafeEncoder.encode(SafeEncoder.java:28)at redis.clients.jedis.Client.hmget(Client.java:179)at redis.clients.jedis.Jedis.hmget(Jedis.java:670)at com.sunadver.lxgj.controller.StudentController.clickVote(StudentController.java:112)at sun.reflect.GeneratedMethodAccessor63.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:606)at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:744)

思考了一下,原来是有人使用了刷票工具导致的,因为正常使用微信投票会获得一个openId,然而这个没有获取到,所以redis在查询key时候如果没有虽然是null,但是我又直接获取map的value,所以就坑了,下面是我写的,因为有人用刷票工具所以我获取不到openid ,然后再获取list元素的值就报错了,还坑的是我没有在结尾加finally{}归还jedis,在判断里加的jedis.close();所以异常发生后直接就断在那了,最后链接池资源被耗光,然后tomcat自然over了

if ((jedis.hmget(openId, "date").get(0)) == null) {


然后加了个判断openid存在的判断,最后乖乖在最后用finally关闭的jedis,在扔进去一天也没断,看日志完全没毛病



阅读全文
0 0