ArrayList.subList 在 HSF 服务中的一个坑

         今天在和老周预发布黑盒流量分包的时候,测试一个场景:用参数List<Long> adzoneids 调 Tanx提供的一个 HSF 服务 AdzoneExchangeService.findDspExchangeAdzonesByAdzoneIds 查询广告位信息,查询List限定大小100.

       代码如下:

ArrayList.subList 在 HSF 服务中的一个坑_第1张图片

逻辑上也好理解,先利用 Guava 提供的Lists工具类将 adzoneIdList按100的大小分割,然后循环调 HSF 服务,看起来不像是有问题,但实际……. 

zuanshi-crm-error.log 中报错调 AdzoneExchangeService 服务超时,接着去查AdzoneExchangeService预发布机上的日志,发现没有任何异常信息,更夸张的是也没有接收请求的信息,怀疑是不是请求根本没有发送,在 hsf.log 中有查到异常信息如下: 

ArrayList.subList 在 HSF 服务中的一个坑_第2张图片

         异常信息java.io.NotSerializableException: java.util.RandomAccessSubList说的是RandomAccessSubList这个类不能被序列化,我们在调用 HSF 服务的时候,参数都要被序列化和反序列化,会不会是参数中的 adzoneIdListTemp序列化的时候异常了呢

       我们的参数List是利用了Guava的Lists工具类生成,会不会是Guava的问题,查看了 Guava 的源码,在实现 Lists.partition(adzoneIdList, 100) 的时候最终还是用的 java.util 包中的 list.subList(fromIndex, toIndex);

   在 JDK6 中 ArrayList 的 subList 方法来自父类 abstractList,可以看到下面

       ArrayList.subList 在 HSF 服务中的一个坑_第3张图片

       RandomAccessSubList<E> extends SubList<E> implements RandomAccess,确实没有实现序列化的 Serializable 接口

       ArrayList.subList() 这个方法返回的无论是 SubList 还是 RandomAccessSubList 都没有实现 Serializable 接口,不能被序列化,不可以直接拿来用作 HSF 的参数

       由此,找到了这个坑,我们使用 ArrayList.subList 截取 List 的返回是不可以直接拿来做 HSF 服务的参数,可以参考下面再转换一下

       adzoneExchangeService.findDspExchangeAdzonesByAdzoneIds(dspId, Lists.newArrayList(adzoneIdListTemp))


你可能感兴趣的:(HSF序列化)