HashedWheelTimer实例太多

时间:2016-08-05 23:35:57

标签: clojure websocket netty

我在Clojure中使用http.async.client 1.1.0来创建websocket客户端。我的代码几乎完全example websocket client,添加了几行逻辑:

  • 重新连接断开连接,等待时间从几秒开始,大约一分钟结束
  • 代码,如果它存在且已打开,则同步关闭先前的websocket

我的问题是,在运行了几天到一周后,我在控制台上打印了此错误消息。它不是由我的日志记录或我的应用程序中的任何内容输出的,虽然起初我认为它与重新连接有关,但是当在之前或之后几小时没有重新连接时我也会得到它。

Jul 24, 2016 6:48:18 AM org.jboss.netty.util.internal.SharedResourceMisuseDetector
WARNING: You are creating too many HashedWheelTimer instances. HashedWheelTimer is a shared resource that must be reused across the application, so that only a few instances are created.

这似乎是由SharedResourceMisuseDetector使用的Netty的Asynchronous Http Client for Java触发的。当HashedWheelTimer的实例超过256个时,就会发生这种情况。我试图了解什么会创建HashedWheelTimer的许多实例,当所有内容指出应该只有一个HashedWheelTimer时。这看起来好像没有正确清理。有没有人知道究竟是什么创造了HashedWheelTimers以及如何防止它?

1 个答案:

答案 0 :(得分:0)

我相信我找到了罪魁祸首。

我为每次重新连接所做的是:

(client/websocket (client/create-client) url ...)

......或者换句话说,每次都创建新的客户端。似乎每个新客户端都实例化它自己的HashedWheelTimer。所以现在我只实例化一个客户端并重用它,这似乎解决了这个问题。