lets-blade / blade

:rocket: Lightning fast and elegant mvc framework for Java8
https://lets-blade.github.io
Apache License 2.0
5.83k stars 1.17k forks source link

坑太多,不敢上生产,搞一天遇到很多严重问题! #401

Closed Lzw2016 closed 2 years ago

Lzw2016 commented 4 years ago

我的环境

问题一:请求json读取就有问题,这个问题不是必现(我也是醉了)

我的请求内容

{
  "domainName": "http://jk.com",
  "originalUrl": "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=monline_3_dg&wd=IDEA%20HTTP%E5%B7%A5%E5%85%B7%20head&rsv_spt=1&oq=ID%2526gt%253BA%2520HTTP%25E5%25B7%25A5%25E5%2585%25B7&rsv_pq=bb4d99e900012007&rsv_t=26523EkyonuMuvG5guYz%2FWJ6DVRA4JyAqpRcSGGmJ1e4R%2Fiv%2F5Ge4jm6md3hnVuZEqyF&rqlang=cn&rsv_enter=1&rsv_dl=tb&inputT=1818&sug=java%2520%25E6%2595%25B0%25E6%258D%25AE%25E5%25BA%2593&rsv_sug3=150&rsv_sug2=0&rsv_sug4=1986"
}

控制台报错

2020-03-02 22:36:55.358 [worker@thread-2] ERROR com.blade.server.netty.HttpServerHandler -  500          POST /api/register
2020-03-02 22:36:55.361 [worker@thread-2] ERROR com.blade.mvc.handler.DefaultExceptionHandler - 
io.netty.handler.codec.http.multipart.HttpPostRequestDecoder$ErrorDataDecoderException: java.io.IOException: Unable to create temporary file, C:\Users\lizw\AppData\Local\Temp\Attr_5509425574122559294_{   "domainName": "http:\jk.com",   "originalUrl": "https:\www.baidu.com\s?ie.att
    at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.parseBodyAttributes(HttpPostStandardRequestDecoder.java:605)
    at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.parseBody(HttpPostStandardRequestDecoder.java:360)
    at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.offer(HttpPostStandardRequestDecoder.java:289)
    at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.offer(HttpPostStandardRequestDecoder.java:46)
    at io.netty.handler.codec.http.multipart.HttpPostRequestDecoder.offer(HttpPostRequestDecoder.java:227)
    at com.blade.mvc.http.HttpRequest.init(HttpRequest.java:359)
    at com.blade.server.netty.HttpServerHandler.buildWebContext(HttpServerHandler.java:95)
    at com.blade.server.netty.HttpServerHandler.lambda$channelRead0$0(HttpServerHandler.java:84)
    at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:602)
    at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577)
    at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:442)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:462)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Unable to create temporary file, C:\Users\lizw\AppData\Local\Temp\Attr_5509425574122559294_{   "domainName": "http:\jk.com",   "originalUrl": "https:\www.baidu.com\s?ie.att
    at java.io.File$TempDirectory.generateFile(File.java:1921)
    at java.io.File.createTempFile(File.java:2010)
    at java.io.File.createTempFile(File.java:2070)
    at io.netty.handler.codec.http.multipart.AbstractDiskHttpData.tempFile(AbstractDiskHttpData.java:90)
    at io.netty.handler.codec.http.multipart.AbstractDiskHttpData.addContent(AbstractDiskHttpData.java:163)
    at io.netty.handler.codec.http.multipart.DiskAttribute.addContent(DiskAttribute.java:99)
    at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.setFinalBuffer(HttpPostStandardRequestDecoder.java:614)
    at io.netty.handler.codec.http.multipart.HttpPostStandardRequestDecoder.parseBodyAttributes(HttpPostStandardRequestDecoder.java:539)
    ... 15 common frames omitted

问题二:客户端发送http请求后就假死,服务端一直不返回响应,断点到PostRoute方法中也不进断点,服务端的控制台没有任何反应!请求也不超时,一直假死!

问题三:自定义中间价Middleware,实现beforeafter 方法 无论怎样就是不进after 方法

问题四:配合你们家的anima使用竟然不支持执行存储过程!

问题五:优雅停机貌似也有问题,关闭进程竟然没有释放数据源连接池

问题六:github issues 上好多人提出了各种资源泄漏问题竟然没有回复,也不知道修复了没有

结论:不能使用生产!!!

建议使用 https://github.com/perwendel/spark 或者 https://gitee.com/jfinal/jfinal

re-ovo commented 4 years ago

本来就不是给你在生产环境用的

yimiyisu commented 4 years ago

@biezhi 第一个问题确实比较严重,线上系统每天都有很多这类错误,希望能尽快修复下

ydq commented 4 years ago

@Lzw2016 理解你对一款开源作品满怀信任的去尝试而遇到各种坑后的无奈与失望感。但是作者无私的开源,完全用不着这样一上来就用这样的语气直接开怼吧。

作为一个开发工作者,当你一个使用开源产品时,遇到问题,提出自己的发现的问题让作者或者其他参与者去改进去修复这是个很好的行为。当然如果有时间有精力的话更好的做法应该是自己去简单的定位一下问题产生的原因,然后尝试解决问题,最后提交 pr 或者贴出自己的意见和建议,为开源贡献一份自己的力量。

每一个开源产品都有它存在的意义,也不是每一个开源作品就一定是完美的,即便如有强大团队背景的 Spring 在每一次的升级中都是修复了很多 Bug,甚至又如商业产品 Windows 操作系统不也是不停地打补丁修 Bug 吗,更何况是这么一个由个人开发者开源作品。当然说这些并不是为了推脱软件本身的 Bug。


@yimiyisu 根据错误信息拼接关键词 “netty Unable to create temporary file” 在某度或者Google中搜索一下 貌似是 Netty 在 Windows 下的坑?

反正我也没试过,手头也没项目,就无耻的照搬一下……

修改 HttpPostStandardRequestDecoder.java#L505 ,在 private void parseBodyAttributes() 方法 添加

   if(!this.request.headers().get("Content->Type").startsWith(APPLICATION_X_WWW_FORM_URLENCODED)){ 
       return; 
   }

不保证有效,但是遇到问题的同学不妨尝试一下~~ 如果尝试有效可以继续跟帖,方便作者改进。

Lzw2016 commented 4 years ago

我只是想告诉大伙,这东西不要上生产,特别是对于哪些忙于搞业务代码着急赶项目进度的人。 建议使用

yimiyisu commented 4 years ago

已经上生产了,欢迎围观 www.kooteam.com 😄

Lzw2016 commented 4 years ago

不错! @yimiyisu

yimiyisu commented 4 years ago

@Lzw2016 理解你对一款开源作品满怀信任的去尝试而遇到各种坑后的无奈与失望感。但是作者无私的开源,完全用不着这样一上来就用这样的语气直接开怼吧。

作为一个开发工作者,当你一个使用开源产品时,遇到问题,提出自己的发现的问题让作者或者其他参与者去改进去修复这是个很好的行为。当然如果有时间有精力的话更好的做法应该是自己去简单的定位一下问题产生的原因,然后尝试解决问题,最后提交 pr 或者贴出自己的意见和建议,为开源贡献一份自己的力量。

每一个开源产品都有它存在的意义,也不是每一个开源作品就一定是完美的,即便如有强大团队背景的 Spring 在每一次的升级中都是修复了很多 Bug,甚至又如商业产品 Windows 操作系统不也是不停地打补丁修 Bug 吗,更何况是这么一个由个人开发者开源作品。当然说这些并不是为了推脱软件本身的 Bug。

@yimiyisu 根据错误信息拼接关键词 “netty Unable to create temporary file” 在某度或者Google中搜索一下 貌似是 Netty 在 Windows 下的坑?

反正我也没试过,手头也没项目,就无耻的照搬一下……

修改 HttpPostStandardRequestDecoder.java#L505 ,在 private void parseBodyAttributes() 方法 添加

   if(!this.request.headers().get("Content->Type").startsWith(APPLICATION_X_WWW_FORM_URLENCODED)){ 
       return; 
   }

不保证有效,但是遇到问题的同学不妨尝试一下~~ 如果尝试有效可以继续跟帖,方便作者改进。

是blade的HttpRequest对象对http request请求解码时,遗漏了application/json和application/xml(微信开放接口回调的头)两种请求类型导致的,由于我是前端一枚,暂时解决不了,求各位大牛帮助一下,代码定位截图如下:

WX20200327-205630@2x
hellokaton commented 4 years ago

@Lzw2016 非常感谢你的反馈,开源软件需要接受鼓励也会有缺陷,目前已经开启了 1.3.0 的重构分支,不过我个人的时间确实有限,尽力维护。

有兴趣修复代码或者提 PR 的同学欢迎哈~ 但我无法确保投入太多精力在上面,目前来看今年是这样。

kute commented 4 years ago

我只是想告诉大伙,这东西不要上生产,特别是对于哪些忙于搞业务代码着急赶项目进度的人。 建议使用

  • spark
  • jfinal
  • Vert.x 当然如果时间充足可以好好研究一下本项目,这个项目还是不错的,只是上生产要谨慎!感谢作者!

感觉和spark java 很类似

hellokaton commented 2 years ago

新版本已经去除了默认的 JSON 实现,使用 Gson 作为序列化器。

hellokaton commented 2 years ago

介于 sparkSpringBoot 之间。