首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
TextRender.render中的writer.flush()为何要注释掉?
大大咧咧
2020-07-24 14:43
请问下TextRender.render()方法中的writer.flush()为何要注释掉?
我的Controller请求现在不能正常返回,试了下加上
writer.flush()就可以返回了
项目:
JFinal
1
评论区
JFinal
2020-07-24 14:59
这个应该是与其它 Render 的 OutputStream.flush() 一起注掉的,主要是因为跟踪到 tomcat、jetty 容器底层,发现它们本身就有一个 flush()
所以 jfinal 中减少一次 flush() 可以提升性能
而 TextRender 面对的是 Writer 而非 OutputStream,或许有些底层容器并没有及时 flush()
请问你用的哪个容器,是不是 undertow? 我还得看看它的源码
此外,由于这个地方不能非分百保障所有容器都及时 flush,所以 jfinal 也只是先注释,并没有删掉这行代码
刚刚已经去除了注释:
https://gitee.com/jfinal/jfinal/commit/ae0c988bc3387981ceb62ebe36abf85d920828b6
回复
JFinal
2020-07-24 15:31
这里还有个问题需要你来帮助一下
在你当前的开发环境下,碰到了 TextRender 需要 writer.flush() 才有返回的情况
那么你再用一下 TemplateRender,看看这个工作是否正常,因为这个也是没有 outputStream.flush() 的
再告知一下你运行使用的容器,是 tomcat、jetty 还是 jfinal undertow,版本是多少,这有助于打磨 jfinal 自身
回复
大大咧咧
2020-07-24 15:49
@JFinal
容器是undertow 2.0.30.Final,很奇怪的是我用了另一台电脑部署的环境是OK的,所有包版本都是一样,应该跟容器调用flush的机制有关,还要再研究下
TemplateRender这个晚上我回去试一下告诉你结果
回复
JFinal
2020-07-24 16:53
@大大咧咧
感谢支持
由于 TextRender 已添加了 flush(), 所以我现在最关心的是 TemplateRender 是否有此问题
希望你能在你出问题的机器上进行这个测试,如果 TemplateRender 也有问题,那就也要添加
有可能与电脑也有关系,要在你出问题的那台电脑上测试
回复
大大咧咧
2020-07-24 21:15
@JFinal
有问题的这台电脑上用TemplateRender也是不行的
回复
JFinal
2020-07-24 21:36
@大大咧咧
幸好你提出来了,正要发布新版本 jfinal 4.9.01 到 maven 中心库,你迟一点就晚来一步了 ^_^
回复
JFinal
2020-07-24 21:43
@大大咧咧
还得麻烦你再多试几个,尤其是 renderQrCode("abc")
这个是输出二维码的,很重要
回复
JFinal
2020-07-24 21:44
renderQrCode(...) 的这么来测试:
public void index() {
renderQrCode("test");
}
然后启动项目,在浏览器里面直接访问上面的 action 即可测试
回复
大大咧咧
2020-07-25 10:20
@JFinal
renderQrCode试了也是不行的
回复
JFinal
2020-07-25 13:18
@大大咧咧
jfinal 4.9.01 已发布到 maven 中心库, renderQrCode 没法改了
不过我在本地跟踪过 renderQrCode,内部已经有 flush() , 所以应该是没问题的
你那里出问题我感觉很奇怪,所以,还请验证一下你扩展一下 QrCodeRender,然后添加一个 flush() ,核心代码如下:
OutputStream os = response.getOutputStream();
// 经测试 200 X 200 大小的二维码使用 "png" 格式只有 412B,而 "jpg" 却达到 15KB
MatrixToImageWriter.writeToStream(bitMatrix, "png", os); // format: "jpg"、"png"
os.flush();
也即原有的 MatrixToImageWriter.writeToStream(...) 使用 os 参数,前后各添加一行代码
回复
发送
我要分享
热门分享
扫码入社
所以 jfinal 中减少一次 flush() 可以提升性能
而 TextRender 面对的是 Writer 而非 OutputStream,或许有些底层容器并没有及时 flush()
请问你用的哪个容器,是不是 undertow? 我还得看看它的源码
此外,由于这个地方不能非分百保障所有容器都及时 flush,所以 jfinal 也只是先注释,并没有删掉这行代码
刚刚已经去除了注释:
https://gitee.com/jfinal/jfinal/commit/ae0c988bc3387981ceb62ebe36abf85d920828b6