今天接到需求说需要给web前端分页加到10000,并且能导出的需求,然后想当然的改了分页,然后跑起来就报了dubbo的错
java.io.IOException: Data length too large: 8843379, max payload: 8388608, channel: NettyChannel 。。。。。
然后找了些方法,测试后只有这种有效
<dubbo:protocol name="dubbo" port="${dubbo.port}" payload="38000000"/>
在xml配置中加入payload的设置,默认8388608是8M,再跑查询没问题了,但是导出又出现新问题,之前的导出方式前端js
window.location.href
但是因为数据量大后台构建excel时间过长导致超时,最终通过
setTimeout(function() { window.location.href = prefix + "/exportBook"}, 1000 );
解决超时的问题,很奇怪为什么 setTimeout能解决超时问题,这货不是一个定时执行的api吗?
在MDN查了一下,了解到JavaScript 的并发模型基于“事件循环”
事件循环
之所以称之为事件循环,是因为它经常按照类似如下的方式来被实现:
while (queue.waitForMessage()) {
queue.processNextMessage();
}
如果当前没有任何消息,queue.waitForMessage() 会同步地等待消息到达。
"执行至完成"
每一个消息完整的执行后,其它消息才会被执行。这为程序的分析提供了一些优秀的特性,包括:一个函数执行时,它永远不会被抢占,并且在其他代码运行之前完全运行(且可以修改此函数操作的数据)。这与C语言不同,例如,如果函数在线程中运行,它可能在任何位置被终止,然后在另一个线程中运行其他代码。
这个模型的一个缺点在于当一个消息需要太长时间才能处理完毕时,Web应用就无法处理用户的交互,例如点击或滚动。浏览器用“程序需要过长时间运行”的对话框来缓解这个问题。一个很好的做法是缩短消息处理,并在可能的情况下将一个消息裁剪成多个消息。
添加消息
在浏览器里,当一个事件发生且有一个事件监听器绑定在该事件上时,消息会被随时添加进队列。如果没有事件监听器,事件会丢失。所以点击一个附带点击事件处理函数的元素会添加一个消息,其它事件类似。
函数 setTimeout 接受两个参数:待加入队列的消息和一个延迟(可选,默认为 0)。这个延迟代表了消息被实际加入到队列的最小延迟时间。如果队列中没有其它消息,在这段延迟时间过去之后,消息会被马上处理。但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完。因此第二个参数仅仅表示最少延迟时间,而非确切的等待时间。
注意这句话 “函数 setTimeout 接受两个参数:待加入队列的消息和一个延迟(可选,默认为 0)。这个延迟代表了消息被实际加入到队列的最小延迟时间。如果队列中没有其它消息,在这段延迟时间过去之后,消息会被马上处理。但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完”;
通过setTimeout加入进去的动作会被加入到运行时的消息队列中,当前消息未执行完是不会处理其他消息的,也就是说他是串行的相当于检查站,必须检查完放行了当前人才会检查下一个人。