好吧,这不是一个真正的答案,更像是一个想法......
正如我在之前的评论中已经提到的,您的LoadingMessageSourceProvider
组件保持状态,因此必须有人负责正确关闭组件。您可以尝试通过注册一个关闭挂钩来将其作为组件的一部分来实现(我不会finalize
在这里考虑:-)。
我宁愿把它留给组件的用户(应用程序),因为它更好地知道何时关闭。事实上,您正在实现一个具有生命周期的轻量级容器 - 在某种程度上类似于实现JSR-236的 Java EE 7 容器提供程序。
鉴于您没有可用的 JSR-236 容器,您必须使调用者能够管理生命周期。我可以想到一种工厂方法,简化示例:
// maintains the executor service (one service per factory)
private MessageSourceProviderFactory f = MessageSourceProviderFactory.instance();
private void stuff() {
MessageSourceProvider msp = f.newBuilder()/*. [...] */.build();
// work with the provider
}
// at some point in time the caller decides to finish
private void end() {
f.shutdown(); // shutdown the factory and the ExecutorService
}
JSR-236 第 3.1.6.1 节在生命周期方面相当有趣:
3.1.6.1 Java EE 产品提供者要求 本小节描述了对 ManagedExecutorService 提供者的附加要求。
- 从 ManagedExecutorService 执行的所有任务都将以提交任务的组件的 Java EE 组件身份运行。
- ManagedExecutorService 的生命周期由应用服务器管理。ManagedExecutorService 接口上的所有生命周期操作都会抛出 java.lang.IllegalStateException 异常。这包括在 java.util.concurrent.ExecutorService 接口中定义的以下方法:awaitTermination()、isShutdown()、isTerminated()、shutdown() 和 shutdownNow()。最终版本 3-11
- 如果任务的组件未启动,则任何提交给执行器的任务都不能运行。
当 Java EE 产品提供者关闭 ManagedExecutorService 实例时:
- 所有提交新任务的尝试都被拒绝。
- 如果未运行,所有提交的任务将被取消。
- 所有正在运行的任务线程都被中断。
- 调用所有注册的 ManagedTaskListener