Guice область для запланированного запуска задания
Мое приложение построено поверх Guice и выполняет запланированные задания (cron4j), которые показывают некоторые проблемы, связанные с экземплярами @Singleton.
Кажется, что подходящее решение моей проблемы имеет Scope, который будет применим для каждого запуска задания, а не Singleton. Это будет похоже на область запроса, но в этом другом сценарии.
Я прочитал документы по пользовательским областям, но мне не ясно, как данная зависимость узнает, как запросить конкретный экземпляр области у 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;
}
Я ценю любое руководство.
1 ответ
Если вы посмотрите на источник для RequestScoped, вы увидите, что он использует ThreadLocal
хранить специальные Context
карта, содержащая все пары ключ-объект для текущего запроса.
Если ваши задания выполняются в одном потоке, вы можете использовать аналогичную стратегию для хранения синглетонов с определенной областью.
Другим вариантом будет создание нового Injector
экземпляр для каждой работы.