2

我的应用程序构建在 Guice 之上并运行计划作业 (cron4j),这些作业显示了一些与固有的 @Singleton 实例相关的问题。

我的问题的适当解决方案似乎具有适用于每个作业运行的范围,而不是单例。它类似于请求范围,但在这种不同的场景中。

我已经阅读了Custom Scopes 的文档,但我不清楚给定的依赖项如何知道如何从 guice 请求特定的作用域实例。

例子:

public class MyJob {
    /* Knows its "run id", which could be used for the scoping mechanism */

    @Inject private Dependency dep;
    public void run() { ... }
}

public class Dependency {
    /* Technically does not know the "run id" from the job */

    @Inject @Named("jobRunScope") private InnerDependency innerDep;
}

我很感激任何指导。

4

1 回答 1

1

如果您查看RequestScoped 的源代码,您会发现它使用 aThreadLocal来存储一个特殊的Context映射,其中包含当前请求的所有键-对象对。

如果您的作业在单个线程中运行,您可以使用类似的策略来存储作用域单例。

另一种选择是Injector为每个作业创建一个新实例。

于 2016-01-05T15:37:26.720 回答