【问题标题】:ThreadPoolExecutor clean up when a thread diesThreadPoolExecutor 在线程死亡时清理
【发布时间】:2013-07-08 23:10:27
【问题描述】:

我有一个ThreadPoolExecutor,它运行几个核心和一定的最大线程数。 运行的任务为每个线程创建 HornetQ(独立)连接,并在线程运行时保持它们处于活动状态。但是,当线程keepAliveTime 到期并且线程死亡时,我们无法关闭它们。有没有办法在线程死掉之前清理资源?

解决此问题的一种方法是对 HornetQ 连接使用池解决方案。

非常感谢任何建议。

【问题讨论】:

  • 这有点含糊:“但是,当线程keepAliveTime时我们无法关闭它们”......你的意思是什么。我试图回答你,但我无法理解这个问题。我是 HornetQ 的项目负责人,我会尽力回答你。
  • 我和 Geni 一起工作。我们正在尝试找出一种方法(如果可能)在我们的线程在空闲后死亡时自动关闭 HornetQ 连接。当线程处于活动状态时,我们希望在每个线程中保持与 HornetQ 的连接打开。目前,我们在日志中收到 HornetQ 连接处于打开状态的警告。这还不错,但我们不希望向我们的日志发送垃圾邮件。
  • 如果我们能够为 HornetQ 独立实现池解决方案(连接和会话),那就太好了。我们可以在发送消息后简单地将连接和会话返回到池中,让池来处理它。
  • 如果你使用的是JDK 1.7,你可以在一个可关闭的接口上嵌入东西,一旦超出范围就会关闭。

标签: java resources hornetq threadpoolexecutor resource-cleanup


【解决方案1】:

如果你使用的是 JDK 1.7,你可以在一个可关闭的接口上嵌入一些东西,一旦超出范围就会被关闭。我们正在努力在 JMS 2 上实现它,但同时您可以嵌入自己的类委派内容。您必须在线程中的某处保留引用的内容,这样它只会在线程消失时超出范围。 (也许是本地线程?)

您需要使用 try (statement=statement.open()) {} 并调用 auto closeable

【讨论】:

  • 我是根据您的 cmets 提出的建议。我不确定这是否会有所帮助。我只是尽力为您提供一些信息。如果这对您没有帮助,请保持沟通畅通,我会继续思考
  • 这很好,但是我们目前使用的是 JDK 1.6.0_21-b07。我们公司正计划升级到JDK 1.7,所以你的建议是可行的。我让 Genti 决定我们是否需要 JDK 1.6 解决方案。
  • 我们实际上使用的是 ThreadLocal,但正如 Mark 所说,我们仍然使用 1.6。我们可能会在升级到 1.7 后再次解决这个问题。虽然我找不到 HornetQ 独立的池解决方案,但我有点惊讶。似乎仅在 JBoss 实现上可用。这就是为什么我转向另一个方向并试图弄清楚在线程终止之前是否有任何方法可以清理。
  • 您通常会在应用程序服务器中使用 JCA 进行池化。对于我们的客户端应用程序,大多数用例都是在不需要池的情况下保持连接活动。如果您打开和关闭很多消费者(这实际上是消息传递中的反模式......请确保您使用 consumerWindowSize=0,否则您将浪费大量通信)
  • 我真的不认为HornetQ 是拥有游泳池的合适地方。我宁愿建议我的用户保持连接打开而不是每次都打开/关闭。这通常会使用户认为消息传递系统是存储和检索数据的存储系统。
猜你喜欢
  • 2018-02-22
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多