Scala中关闭未继承AutoCloseable的Micrometer资源方案咨询
问题
我在使用Micrometer框架时,需要找到合适的方法关闭已打开的资源。我的binderList中部分MeterBinder资源继承了AutoCloseable并覆写了close方法,但还有一部分没有继承该接口。
我的Scala代码如下:
class MetricConfiguration extends AutoCloseable{ var binderList : List[MeterBinder] def initializePrometheusMetricsConfiguration(): Unit = { binderList = List ( new JvmGcMetrics(), new JvmHeapPressureMetrics(), new JvmMemoryMetrics() ) init(binderList) } private def init(binders: List[MeterBinder]): Unit = { Metrics.globalRegistry.config(). meterFilter(new MeterFilter { override def map(id: Meter.Id): Meter.Id = { id.withName("hello" + id.getName) } }) binders.foreach(b => b.bindTo(Metrics.globalRegistry)) } } override def close(): Unit = ???
我刚接触Scala,之前在Java中是这么实现类似逻辑的:
@Override public void close() { this.binderList.stream() .filter(b -> b instanceof AutoCloseable) .map(b -> (AutoCloseable) b) .forEach(Closeables::closeQuietly); }
想知道Scala里怎么实现同等逻辑。
解决方案
方式一:借助Guava的Closeables复用静默关闭逻辑
如果项目已经依赖Guava,可以直接沿用Java中的Closeables.closeQuietly来处理:
import com.google.common.io.Closeables override def close(): Unit = { binderList.foreach { case autoCloseable: AutoCloseable => Closeables.closeQuietly(autoCloseable) case _ => // 跳过未实现AutoCloseable的实例 } }
方式二:自行实现静默关闭逻辑
如果不想引入Guava依赖,也可以自己处理关闭时的异常:
override def close(): Unit = { binderList.foreach { case autoCloseable: AutoCloseable => try { autoCloseable.close() } catch { case _: Exception => // 忽略关闭过程中的异常 } case _ => // 不处理非AutoCloseable类型的实例 } }
额外优化提示
原代码中var binderList: List[MeterBinder]未初始化,建议修改为:
var binderList: List[MeterBinder] = Nil
避免运行时出现未初始化的错误。
内容的提问来源于stack exchange,提问作者LifeStartsAtHelloWorld
相关产品推荐
相关产品推荐

