JFinal redisPlugin 读取数据出现IOException

项目启动之后,操作都很正常,大概过了5分钟左右。就会报错。因为我每访问一次都会去redis中获取当前登录的用户信息。然后就出现错误了。debug看了下,发现redis可以正常获取到数据,但是执行valueFromBytes()出错了。

FstSerializer.valueFromBytes().

具体报错信息如下:

java.lang.RuntimeException: java.io.IOException: java.lang.RuntimeException: unknown object tag -19
at com.jfinal.plugin.redis.serializer.FstSerializer.valueFromBytes(FstSerializer.java:78)
at com.jfinal.plugin.redis.Cache.valueFromBytes(Cache.java:1211)
at com.jfinal.plugin.redis.Cache.get(Cache.java:91)
at com.chinatwse.wineage.commons.tools.ToolCache.get(ToolCache.java:47)
at com.chinatwse.wineage.core.admin.service.AdministratorService.getCache(AdministratorService.java:130)
at com.chinatwse.wineage.core.admin.service.AdministratorService$$FastClassByCGLIB$$88570c08.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at com.jfinal.aop.Invocation.invoke(Invocation.java:80)
at com.jfinal.aop.Callback.intercept(Callback.java:85)
at com.chinatwse.wineage.core.admin.service.AdministratorService$$EnhancerByCGLIB$$863c200f.getCache(<generated>)
at com.chinatwse.wineage.core.interceptor.AuthAdminInterceptor.getCurrAdministrator(AuthAdminInterceptor.java:285)
at com.chinatwse.wineage.core.interceptor.AuthAdminInterceptor.intercept(AuthAdminInterceptor.java:65)
at com.jfinal.aop.Invocation.invoke(Invocation.java:67)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
at com.chinatwse.wineage.manage.handler.ManageHandler.handle(ManageHandler.java:69)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
2016-12-21 16:27:12[ERROR]-[Thread: http-apr-8081-exec-4]-[com.jfinal.core.ActionHandler.handle()]: /modules/custom/announce?v=4.0
java.lang.RuntimeException: java.io.IOException: java.lang.RuntimeException: unknown object tag -19
at com.jfinal.plugin.redis.serializer.FstSerializer.valueFromBytes(FstSerializer.java:78)
at com.jfinal.plugin.redis.Cache.valueFromBytes(Cache.java:1211)
at com.jfinal.plugin.redis.Cache.get(Cache.java:91)
at com.chinatwse.wineage.commons.tools.ToolCache.get(ToolCache.java:47)
at com.chinatwse.wineage.core.admin.service.AdministratorService.getCache(AdministratorService.java:130)
at com.chinatwse.wineage.core.admin.service.AdministratorService$$FastClassByCGLIB$$88570c08.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at com.jfinal.aop.Invocation.invoke(Invocation.java:80)
at com.jfinal.aop.Callback.intercept(Callback.java:85)
at com.chinatwse.wineage.core.admin.service.AdministratorService$$EnhancerByCGLIB$$863c200f.getCache(<generated>)
at com.chinatwse.wineage.core.interceptor.AuthAdminInterceptor.getCurrAdministrator(AuthAdminInterceptor.java:285)
at com.chinatwse.wineage.core.interceptor.AuthAdminInterceptor.intercept(AuthAdminInterceptor.java:65)
at com.jfinal.aop.Invocation.invoke(Invocation.java:67)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:74)
at com.chinatwse.wineage.manage.handler.ManageHandler.handle(ManageHandler.java:69)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: java.lang.RuntimeException: unknown object tag -19
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:243)
at com.jfinal.plugin.redis.serializer.FstSerializer.valueFromBytes(FstSerializer.java:75)
... 33 more
Caused by: java.lang.RuntimeException: unknown object tag -19
at org.nustaq.serialization.FSTObjectInput.instantiateSpecialTag(FSTObjectInput.java:430)
at org.nustaq.serialization.FSTObjectInput.readObjectWithHeader(FSTObjectInput.java:360)
at org.nustaq.serialization.FSTObjectInput.readObjectFields(FSTObjectInput.java:701)
at org.nustaq.serialization.FSTObjectInput.instantiateAndReadNoSer(FSTObjectInput.java:555)
at org.nustaq.serialization.FSTObjectInput.readObjectWithHeader(FSTObjectInput.java:370)
at org.nustaq.serialization.FSTObjectInput.readObjectInternal(FSTObjectInput.java:327)
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:307)
at org.nustaq.serialization.FSTObjectInput.readObject(FSTObjectInput.java:241)
... 34 more

请大神帮我看下...非常感谢

评论区

JFinal

2016-12-21 16:53

目测是某个数据无法被 FST 反向序列化,在使用 jfinal redis plugin 时注意一个问题:存入数据与读取数据都要使用 jfinal redis plugin,而不能是写入数据用控制台或者另外的客户端,而读的时候用 jfinal redis plugin

因为 jfinal 默认用的 FST 做的数据序列化与反向序列化,这两个操作需要互相可逆

2016-12-22 16:54

亲,你的是按第七章 RedisPlugin配置的吗,我配置不行呢。

fengting

2016-12-24 19:11

@流 是的,配置的代码很简单。就那么几行。

fengting

2016-12-24 19:11

@JFinal 谢谢波总。

JFinal

2016-12-24 19:18

@fengting 如果用的 incr、incrBy、decr、decrBy 放入的数据,取的时候用一下 getCounter(key) 方法

i++

2017-03-09 20:52

@JFinal 用hincrBy方法放入的数据用hget时也出现这个错误了。要怎么办?急。。在线等。

JFinal

2017-03-09 21:10

@i++ 用一下 getCounter(...) 去获取即可,这个在 jfinal 手册中有红色字体做过说明,仔细看一下

i++

2017-03-09 22:12

@JFinal 我用的是jfinal2.2的。 getCounter(key)方法只有一个参数,但我用的是hincrBy()方法,不是incr方法啊。郁闷 。难道3.0的getCounter有两个参数了?

JFinal

2017-03-09 23:10

@i++ hincrBy 貌似还没有针对性的添加其 getCounter 方法,暂时用下面的方法解决一下:
Redis.use().getJedis().hget(key, field);

jfinal 3.1 考虑添加一个 getHCounter()

i++

2017-03-10 09:19

@JFinal 要这么用:
byte[] s = jedis.hget(FstSerializer.me.keyToBytes(key),FstSerializer.me.fieldToBytes(field));
System.out.println(new String(s));

i++

2017-03-10 10:02

@JFinal 请问我想给Cache类加个扩展方法。要怎么做?是不是要自己仿RedisPlugin重新写个plugin。

JFinal

2017-03-10 10:58

@i++ 写个工具类利用现有的 API 封装一下,例如就叫 MyRedis。jfinal 后续版本会添加上一些必要的 API,没有添加的使用自自己的工具类就蛮好

JFinal

2017-03-10 10:59

@i++ 注意在获取 getJedis() 以后,要在 finally 块中进行资源回收,参考一下 redis plugin 下的 Cache.java

小风

2017-12-21 17:17

@JFinal 我也遇到这个问题。确认了下都是通过Cache下进行 set和get的。应该怎么解决呢

热门反馈

扫码入社