对Atmosphere中AtmosphereResourceImpl "Exception during suspend() operation"问题的追踪

在Atmosphere通信正常的情况下关闭浏览器,有时候会看到log出现一行错误

[qtpxxx-xx] WARN org.atmosphere.cpr.AtmosphereResourceImpl - Exception during suspend() operation xxxException

看到WARN的等级感觉应该不会有什么问题,但总觉得觉得应该有什么地方出了问题,为什么具体的错误行数被隐藏起来?

我看的是2.4.13的源码,当然现在最新版的2.6.x我也看了,一样,这块没改,问我为什么不用2.5.x,根本用不了,不知道搞了什么鬼,2.5都跑不了直接开2.6,跟scala新版本的兼容也有很大的问题,只能用老版本的scala。

打开AtmosphereResourceImpl,直接搜索Exception during suspend就能找到报错的地方,它在665行,逐行调试 发现在onDisconnect调用时报错,跟踪进入753行,发现它想关闭所有的Listener,正常情况下有两个Listener

  1. org.atmosphere.interceptor.HeartbeatInterceptor$2 (Heartbeat Interceptor Support)
  2. org.scalatra.atmosphere.ScalatraAtmosphereHandler$ScalatraResourceEventListener

第一个Listener正常关闭,第二个Listener触发空指针,进入第二个Listener的onDisconnect()看看发生了什么,这个Listener在scalatra-atmosphere下,我用的是_2.12:2.65的版本,也许你会好奇为什么有两个版本号,我用的是gradle,不同于sbt,在gradle这边的maven中央仓库中,scalatra的包自带版本号,所有的子包又有自己的版本号,我用过这么多库,也是头次见这种玩法,当然我检验过2.7.1新库,代码是一样的,而且Atmosphere本身都没法用,何况他只是一个桥接器,路径在org\scalatra\atmosphere\ScalatraAtmosphereHandler.scala ,更新了这么多版本,连注释的三行代码都一模一样

可以看到在36行发生报错,这个foreach可以改成直接get,不然不好调试,IDEA Evaluate对scala支持不佳

client(event.getResource).get.receive.lift(Disconnected(disconnector, Option(event.throwable)))

NPE就发生在这一行,那他到底在哪呢,client(event.getResource).get.receive得到了使用atmosphere时候定义的AtmosphereClient中的AtmoReceiveDisconnected(disconnector, Option(event.throwable))自然也是正常,那么问题出在哪呢,自然是调用AtmosphereClient时定义的AtmoReceive => case Disconnected出了错,这里出现任何非中止性的异常,都会被AtmosphereResourceImpl捕获,然后抛出Exception during suspend的warn,但在DEBUG的日志等级下才会打印详细的堆栈信息。

在Vaadin上发现有人讨论这个问题,原来Vaadin也用了Atmosphere,https://vaadin.com/forum/thread/15195626/15321192 ,可以看到他们的一个产品经理Tatu Lund在二楼回复

If this exception happens due closing of the browser by the user it is harmless. The reason it has been logged is that the server cannot know now whether the application in browser has crashed or it has been just closed. Also it may be possible that the communication pipeline between server and browser has been disconnected for some reason.

Tatu Lund认为错误无关紧要,导致这行log的原因是不知道用户关闭浏览器时是因为崩溃还是正常关,亦或是通信管道意外断开。

但根据源码的逻辑来看,这并不是一个完全正确的解释,这个错误代表着Disconnected监听异常,无论用户如何关浏览器,如何断开连接,在服务器端也不可能根据这些不同的意外情况,做出不同的处理,所以无论什么情况都不应该报出这个错误。这是调用Atmosphere时的Disconnected监听本身出了问题,Disconnected中可能发生什么操作呢?有可能是记录日志时出了问题,有可能是更新用户在线状态出了问题,有可能是分发给其他客户端出了问题,无论是什么问题,都会被AtmosphereResourceImpl拦截,统一抛出这个WARN。

楼主继续追问怎么关闭这个log,看了源码就知道这段WARN只要Disconnected监听异常就一定会打出来,没有其他控制,只能针对性改log level,调整到ERROR等级,或者排除这个类的log,因为这个类没有ERROR级别的错误。

这个AtmosphereResourceImpl类功能繁多,有一千多行,全类各方法合计抛出22个异常,值得一提的是,其中一个错误消息的链接指向已经失效了,在144行,最新版4.6在141行,是一个获取Session的问题,它指向 http://java.net/jira/browse/GLASSFISH-18856 ,然而java.net网站早已关闭,2016年Oracle就已经发布了关闭网站的公告,这个问题的讨论本来在Github上有,现在也被删掉了,在 https://github.com/eclipse-ee4j/glassfish/issues/18856 最下面有一个贴文指向https://github.com/javaee/glassfish/issues/18856 ,但现在已经是404了,JIRA GLASSFISH-18856到底是什么?解决了没有?不得而知。

最后我想说,Atmosphere不是一个值得选择的组件,它缺少维护,设计比较混乱,可惜被scalatra所支持,我也不想给官方提issue了,看到很多2014,2015年的issue到现在还没close,感觉这种小问题简直不值一提,log level在开发的时候也确实应该调成DEBUG,这样自然能轻松定位问题,但这个异常处理机制真不合理,谁知道线上会出什么问题呢,总不能也改成DEBUG,没有记录到准确的堆栈信息。也许这个问题该scalatra的桥接器来处理,毕竟是个很小的事,在onDisconnect包个try catch级别打印ERROR级日志即可,我看下面的liftAction()就有一个try catch,直接printStackTrace()出来了,说明这是可行的,但scalatra把所有子组件都放在自己的主项目中,拖家带口,解释起来比较麻烦,而且scalatra很大概率认为应该转给atmosphere来处理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容