Статьи

2 способа передачи свойств / параметров в пакетном режиме Java EE 7

Когда дело доходит до средства пакетной обработки Java EE 7, существует два способа передачи свойств / параметров в порции и пакеты. Это краткое руководство показывает вам 2 способа, которые могут очень часто использоваться при разработке пакетной обработки в Java EE 7.

1. Предварительно определенные свойства / параметры перед временем выполнения

Предварительно определенные свойства — это свойства (пары имя-значение), которые вы определяете перед развертыванием приложения. Другими словами, он фиксированный и статический, а не динамический, и значения всегда будут оставаться неизменными при его извлечении. Это делается с помощью XML-файла дескриптора задания, который находится, например, в META-INF / batch-jobs / demo-job.xml . Например:

01
02
03
04
05
06
07
08
09
10
<?xml version="1.0" encoding="UTF-8"?>
<job id="demoJob" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     version="1.0">
    <properties>
        <property name="staticParamName1" value="staticParamValue1" />
        <property name="staticParamName2" value="staticParamValue2" />
    </properties>
  
    <!-- Then, the rest of the steps definition -->
</job>

Все, что для этого нужно, — это поместить каждое предопределенное свойство в тег <properties /> . После развертывания приложения эти свойства будут доступны для объектов ItemReader, ItemProcessor, ItemWriter и Batchlet, определенных в файле XML, во время выполнения.

Вот пример того, как получить предопределенные свойства / параметры во время выполнения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
@Dependent
@Named( "DemoReader" )
public class DemoReader extends AbstractItemReader {
    @Inject
    private JobContext jobCtx;
  
    @Override
    public void open( Serializable ckpt ) throws Exception {
  
        // Retrieve the value of staticParamName1 defined in job descriptor XML
        String staticParamValue1 = jobCtx.getProperties().getProperty( "staticParamName1" );
  
        // The rest of the implementation
    }
  
    // The rest of the overridden methods
}

Обратной стороной этого является то, что значение свойств всегда будет оставаться неизменным на протяжении всего времени выполнения. Если вам нужно передать динамическое значение объектам пакетного шага, читайте дальше …

2. Передача свойств / параметров динамически во время выполнения

Есть ситуации, когда динамические свойства / значения параметров желательны во время пакетного запуска. Для этого сначала нужно определить свойства / параметры и передать оператору задания пакетное задание.

Например, у меня есть JobOperator (Singleton EJB), который запускает пакетное задание через метод runBatchJob () с двумя динамическими свойствами / параметрами, которые передаются объектам пакетного задания:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@Singleton
public class BatchJobOperator implements Serializable {
  
    public void runBatchJob() {
        Properties runtimeParameters = new Properties();
        runtimeParameters.setProperty( "dynamicPropertyName1", "dynamicPropertyValue1" );
        runtimeParameters.setProperty( "dynamicPropertyName2", "dynamicPropertyValue2" );
  
        JobOperator jo = BatchRuntime.getJobOperator();
  
        // Run the batch job with the runtimeParameters passed
        jo.start( "name-of-job-xml-file-without-dot-xml", runtimeParameters );
    }
}

Однажды, когда на сервере приложений выполняются задания, объекты, задействованные в задании (ItemReader, ItemProcessor, ItemsWriter и Batchlet), могут получить свойства, установленные в runtimeParameters , но другим способом. Вот как это сделать в ItemReader (то же самое относится и к остальным объектам шага пакетного задания):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
@Dependent
@Named( "DemoReader" )
public class DemoReader extends AbstractItemReader {
    @Inject
    private JobContext jobCtx;
  
    @Override
    public void open( Serializable ckpt ) throws Exception {
  
        // Here's how to retrieve dynamic runtime properties / parameters
        Properties runtimeParams = BatchRuntime.getJobOperator().getParameters( jobCtx.getExecutionId() );
        String dynamicPropertyValue1 = runtimeParams.getProperty( "dynamicPropertyName1" );
        String dynamicPropertyValue2 = runtimeParams.getProperty( "dynamicPropertyName2" );
  
        // The rest of the implementation
    }
  
    // The rest of the overridden methods
}

Обратите внимание, что вместо получения свойств из JobContext свойства, определенные в динамической среде выполнения, должны быть получены из JobOperator BatchRuntime путем передачи идентификатора выполнения контекста задания.

Надеюсь, это полезно.