所以目标是我们有一个多线程环境,我们希望为每个请求重用 MqttClient 连接。初始化客户端是一个高延迟操作,我们可以在启动期间仅在第一次调用时执行一次。之后我们想重用它们。
我们首先使用 ThreadLocal 实现,因为我们希望它们被重用,所以我们没有清除导致内存泄漏和 Tomcat 服务器每次重新生成线程的 threadLocal。
现在我们有三种解决方案,一种是使用 ThreadPoolExecutor 并将该自定义对象与线程本身绑定。但是当我们将线程从珊瑚框架切换到执行线程时,我们需要传递上下文,我们不确定它是否安全。
第二个是我们可以使用一个并发的 hashmap,键是 threadId,值是对象。每个珊瑚线都有自己的对象。值得怀疑的是,如果一个线程死亡并产生另一个线程,那么 threadId 是否会被重用。并且地图中的现有条目将被垃圾收集或不收集。
第三种解决方案是我们可以实现自定义对象的 apache 池,然后可以借用。 问题是如果我们从池中借用一个对象并且没有可用的对象那么它是否会给调用线程一些异常。 我们可以定义一个固定数量 == 没有珊瑚线,这样我们就永远不会离开客户。
现在我们想为我们的多客户端解决方案提供最好的解决方案。