使用番石榴的可重新启动服务

2022-09-02 22:37:27

我目前正在开发一个应用程序,我需要管理多个服务的状态,并根据一些事件停止/启动它们。问题是,正如文档中所述,番石榴的服务是单一的,这意味着,一旦停止,就无法再次启动。

由于我需要以某种方式规避这个问题,我面临着几个替代方案,我想把它们拿出来供考虑(特别是因为每个缺点都有我现在不知道的缺点)。

这个问题的第一个明显解决方案是,当我需要“重新启动”它时,实例化一个新的服务。这有效,但在我当前的架构中,它会使事情变得复杂一些:目前我正在初始化所有服务,并根据来自EventBus的事件,在需要时启动或停止它们。调用 start 和 stop 方法的类仅保存对服务映射的引用,并根据收到的事件在这些实例上调用正确的方法。如果我需要实例化一个新对象来响应事件,我将不得不放弃我目前拥有的一些解耦(可能是通过保留每种类型的服务的类并使用反射调用构造函数)。

另一种可能性是将服务接口实现为可重新启动的线程服务(或类似的东西)。如果我采用此路线,我的 start() 方法可以创建另一个 Thread,就好像它是第一次一样,并重置状态。

第二种方法有什么明显的缺点吗?我担心我可能会在这里错过一些明显的缺点(除了必须编写更复杂的代码),特别是在线程管理方面。


答案 1

我推荐你的第一种方法,但是有比反思更好的方法。使用依赖关系注入,或者可能传递对象而不是使用 ,可能是这里要走的路。Supplier<Service>serviceClass.newInstance()


答案 2

请考虑使用 Guice 的作用域。


推荐