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 экземпляр для каждой работы.

Другие вопросы по тегам