开发日记 20180718
com.alibaba.dubbo.remoting.transport.AbstractCodec.checkPayload() ERROR Data length too large
1 | com.alibaba.dubbo.remoting.transport.AbstractCodec.checkPayload() ERROR Data length too large: 11557050, max payload: 8388608 java.io.IOException: Data length too large: 11557050, max payload: 838860 |
在使用dubbo框架开发的时候,需要做一个导出csv文件的功能,查询大量的数据然后在提供者这边进行处理导出,其中数据达到过20万行以上,几十M的数据,抛出了这样一个异常。遇到服务提供者从数据库查询或者其他地方返回过大的对象,导致报错时,尽管有办法取消这个数据长度的限制,但是这并不符合程序开发的初衷。我们需要将对于数据的处理放在业务层,我在这里做了异步导出,给前端返回的仅仅是一个程序完成的状态,完美的解决了这个问题。
在dubbo消费者服务中写aop方法拦截工具类中的方法
尽管服务的提供者和消费者都引入的工具类模块的依赖,但是拦截器的实际拦截的还是那个实际本身所在模块的方法。如果工具类是在消费者service层被使用的,那么在上层模块的拦截器是无法拦截到这个方法的。
在dubbo服务中手动获取注册的提供者的bean
在这里犯的错:以为通过SpringContextHolder.getBean()可以获取,是我傻逼了,dubbo中的服务怎么能用spring上下文获取呢。这里我使用dubbo的方式完成了这个功能。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20/**
* 获取服务的代理对象
*
* @return
*/
public static <T> T getReferenceConfig(String appName,String address,Class<?> interfaceClass) {
String key = interfaceClass.getName();
ReferenceConfig<T> referenceConfig = (ReferenceConfig<T>)referenceCache.get(key);
if(referenceConfig == null){
referenceConfig = new ReferenceConfig<T>();
referenceConfig.setApplication(application);
referenceConfig.setRegistry(getRegistryConfig(appName,address));
referenceConfig.setInterface(interfaceClass);
referenceCache.put(key,referenceConfig);
}
return referenceConfig.get();
}