JSR-352 в автономном пакете Google Guice
Я пытаюсь сделать пакет, используя javax.batch 1.0 с Java SE 7 и Guice.
Читая документацию по JavaEE 7 о JSR-352, они явно настроили код, который будет выполняться внутри Glassfish, и я не нашел упоминаний о том, как запустить его снаружи.
Теперь моя проблема связана с интерфейсом JobContext, который должен автоматически вводиться через CDI: как это сделать с помощью Guice? Попытка что-то вроде:
@Provides
@Inject
JobContext providesJobContext(Provider<JobContext> provider) {
return provider.get()
}
концептуально неправильно, и это приводит к StackruError (так что я здесь:>). Это действительно необходимо? Примеры внедряют его, чтобы получить свойства Job. Могу ли я связаться с ними, может быть, через
jobOperator.getParameters(<executionID>)
?
Спасибо.
Я никогда не использовал Weld (который, как я понимаю, предоставил бы CDI на Java SE), поэтому единственной альтернативой был бы Spring Batch.
2 ответа
Объяснение API
Во-первых, чтобы уточнить между "свойствами задания" и "параметрами задания".
"Параметры задания" - это свойства, передаваемые JobOperator#start(String,Properties)
и JobOperator#restart(long,Properties)
,
"Свойства работы" доступны через JobContext#getProperties()
являются потомками элемента / job / properties.
Например, у этого задания есть два свойства в объекте, возвращаемом: JobContext#getProperties()
<job>
<properties>
<property name="initialAmount" value="100" />
<property name="bonusAmount" value="#{jobParameters['bonusAmount']}?:100;" />
</properties>
</job>
Таким образом, параметр задания - это всего лишь один из возможных источников значений для определения свойства задания.
Что касается доступа к параметрам, JobOperator.getParameters(long executionId)
это, вероятно, не очень вам поможет, так как наиболее естественный способ получить текущий идентификатор выполнения - это тот же самый контекст, в котором у вас возникают проблемы с инъекцией.
SE с Guice
Похоже, вы имеете в виду эталонную реализацию JSR 352 (jbatch, входит в Glassfish).
Это правда, что мы не особо задумывались о SE с внедрением зависимостей Guice, и я не достаточно эксперта, чтобы понять, поможет ли это даже упомянуть.
С помощью Weld в Glassfish мы действительно используем такую технику, чтобы позволить пакетной среде выполнения заполнять определенные инжекцией точки.
public class BatchProducerBean {
...
@Produces
@Dependent
public JobContext getJobContext() {
...
return JobContextImpl;
}
}
Я был бы рад узнать больше об интеграции Guice с jbatch. Вы можете найти источник проекта (пока нет реальной Wiki) на GitHub.
Weld - это эталонная реализация JSR-299, которая содержит CDI в JavaEE 6. Эта эталонная реализация включена в Glassfish, поэтому вы можете эффективно ее использовать.
Пример из Oracle можно найти здесь:
@Named
public class SimpleItemReader
extends AbstractItemReader {
@Inject
private JobContext jobContext;
...
}
Цитата:
Я никогда не использовал сварку
Здесь реализация не имеет значения, потому что она просто реализует спецификацию JSR.