Java 如何创建Cassandra ITrigger析构函数?

Java 如何创建Cassandra ITrigger析构函数?,java,multithreading,cassandra,apache-kafka,triggers,Java,Multithreading,Cassandra,Apache Kafka,Triggers,我正在使用实现ITrigger接口的触发器jar将数据从Cassandra发送到Kafka 为了确保仅在某些服务器可用时才尝试向Kafka发送消息(以避免超时开销),我正在生成一个新线程,该线程尝试以设置的频率连接到Kafka,并在状态更改时更新布尔值 在我的Cassandra触发器构造函数中,我正在为这个卡夫卡检查器生成一个新线程 // Start the background thread to monitor apache health b_array =

我正在使用实现ITrigger接口的触发器jar将数据从Cassandra发送到Kafka

为了确保仅在某些服务器可用时才尝试向Kafka发送消息(以避免超时开销),我正在生成一个新线程,该线程尝试以设置的频率连接到Kafka,并在状态更改时更新布尔值

在我的Cassandra触发器构造函数中,我正在为这个卡夫卡检查器生成一个新线程

        // Start the background thread to monitor apache health
         b_array = cr.get_broker_array();
         bt = new background_thread(b_array, ms, lLog);
         bt.start();
我的问题是,我没有任何事件可以让我知道主触发器何时被重新加载

如果触发器重新加载了

/nodetool重载触发器

旧线程一直在后台运行,无法清理。我看过一些参考资料,其中提到使用
finalize()
是个坏主意,不应该这样做

目前刷新触发器的唯一方法实际上是重新启动Cassandra节点,这是错误的


对于如何处理或实现这一点的任何意见都将不胜感激。

这就是我为解决这个问题所做的

  • 跟踪在后台线程上接收的最后一条消息的时间
  • 如果15分钟内没有收到新消息,我会在每个循环中将卡夫卡健康检查的速度减慢30秒
  • 如果4小时内没有收到新消息。我将退出健康检查循环。每次重新加载触发器时,都会启动触发器的一个新实例,并启动一个新线程触发器/线程的旧实例不会收到新消息。因此,超时等待将杀死后台僵尸线程(这是我最初的问题)。
  • 在处理新消息时,我检查后台线程的状态是否已终止,如果是,则启动一个新的后台线程。(带有写锁,以确保并发消息不会启动多个线程)