计划作业的 Guice 范围 运行
Guice scope for scheduled job run
我的应用程序是建立在 Guice 和 运行s 计划作业 (cron4j) 之上的,它们显示了一些与固有的 @Singleton 实例相关的问题。
我的问题的适当解决方案似乎具有适用于每个 作业 运行 的范围,而不是单例。它类似于请求范围,但在这种不同的情况下。
我已阅读 docs for 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;
}
感谢任何指导。
如果你查看 the source for RequestScoped,你会发现它使用 ThreadLocal
来存储一个特殊的 Context
映射,保存所有 key-object 对当前请求。
如果您的作业 运行 在单个线程中,您可以使用类似的策略来存储作用域单例。
另一种选择是为每个作业创建一个新的 Injector
实例。
我的应用程序是建立在 Guice 和 运行s 计划作业 (cron4j) 之上的,它们显示了一些与固有的 @Singleton 实例相关的问题。
我的问题的适当解决方案似乎具有适用于每个 作业 运行 的范围,而不是单例。它类似于请求范围,但在这种不同的情况下。
我已阅读 docs for 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;
}
感谢任何指导。
如果你查看 the source for RequestScoped,你会发现它使用 ThreadLocal
来存储一个特殊的 Context
映射,保存所有 key-object 对当前请求。
如果您的作业 运行 在单个线程中,您可以使用类似的策略来存储作用域单例。
另一种选择是为每个作业创建一个新的 Injector
实例。