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.

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