Использование одного из параметров задания в Item Processor в приложении Spring Batch - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь получить аннотации параметров работы в элементе процессора с помощью Spring-Batch-Annotation. Я реализовал это, перейдя по ссылке ниже; но для меня переменная (batchRunName) становится нулевой, когда я пытаюсь получить к ней доступ в своем классе Processor. Может кто-нибудь, пожалуйста, посмотрите на это. Я уверен; Мне не хватает какой-то мелочи.

Как передать параметры задания в обработчик элементов, используя аннотацию Spring Batch

public static void main(String[] args) {
    contextObj = new ClassPathXmlApplicationContext(springConfig);
    jobObj = (Job) contextObj.getBean("XYZ-1001-DD-01");
    JobParametersBuilder jobBuilder = new JobParametersBuilder();
    System.out.println("args[0] is " + args[0] );
    jobBuilder.addString("batchRunName", args[0]);  



public class TimeProcessor implements ItemProcessor<Time, TimeMetric> {

private DataSource dataSource;  
@Value("#{jobParameters['batchRunNumber']}")
private String batchRunNumber;


public void setBatchRunNumber(String batchRunNumber) {
    this.batchRunNumber = batchRunNumber;
}


<bean id="timeProcessor"
    class="com.xyz.processor.TimeProcessor" scope="step">
    <property name="dataSource" ref="oracledataSource" />
</bean> 

================= ПОЛНАЯ КОНФИГУРАЦИЯ XML =======================

<import resource="classpath:/batch/utility/skip/batch_skip.xml" />
<import resource="classpath:/batch/config/context-postgres.xml" />
<import resource="classpath:/batch/config/oracle-database.xml" />

<context:property-placeholder
    location="classpath:/batch/jobs/TPF-1001-DD-01/TPF-1001-DD-01.properties" />
<bean id="gridSizePartitioner"
    class="com.tpf.partitioner.GridSizePartitioner" />

      <task:executor id="taskExecutor" pool-size="${pool.size}" />
<batch:job id="XYZJob" job-repository="jobRepository"
    restartable="true">

    <batch:step id="XYZSTEP">
        <batch:description>Convert TIF files to PDF</batch:description>
        <batch:partition partitioner="gridSizePartitioner">

            <batch:handler task-executor="taskExecutor"
                grid-size="${pool.size}" />
            <batch:step>
                <batch:tasklet allow-start-if-complete="true">
                    <batch:chunk commit-interval="${commit.interval}"
                        skip-limit="${job.skip.limit}">

                        <batch:reader>
                            <bean id="timeReader"
                                class="org.springframework.batch.item.database.JdbcCursorItemReader"
                                scope="step">
                                <property name="dataSource" ref="oracledataSource" />
                                <property name="sql">
                                    <value>                                     
                                    select TIME_ID as timesheetId,count(*),max(CREATION_DATETIME) as creationDateTime , ILN_NUMBER as ilnNumber
                                    from TS_FAKE_NAME
                                    where creation_datetime  >= '#{jobParameters['creation_start_date1']} 12.00.00.000000000 AM' 
                                    and creation_datetime &lt;  '#{jobParameters['creation_start_date2']} 11.59.59.999999999 PM' 
                                    and mod(time_id,${pool.size})=#{stepExecutionContext['partition.id']} 
                                    group by  time_id ,ILN_NUMBER                                   

                                    </value>
                                </property>
                                <property name="rowMapper">
                                    <bean
                                        class="org.springframework.jdbc.core.BeanPropertyRowMapper">
                                        <property name="mappedClass"
                                            value="com.tpf.model.Time" />
                                    </bean>
                                </property>
                            </bean>
                        </batch:reader>
                        <batch:processor>
                            <bean id="compositeItemProcessor"
                                class="org.springframework.batch.item.support.CompositeItemProcessor">
                                <property name="delegates">
                                    <list>
                                        <ref bean="timeProcessor" />
                                    </list>
                                </property>

                            </bean>
                        </batch:processor>


                        <batch:writer>
                            <bean id="compositeItemWriter"
                                class="org.springframework.batch.item.support.CompositeItemWriter">
                                <property name="delegates">
                                    <list>
                                        <ref bean="timeWriter" />
                                    </list>
                                </property>
                            </bean>
                        </batch:writer>
                        <batch:skippable-exception-classes>
                            <batch:include
                                class="com.utility.skip.BatchSkipException" />
                        </batch:skippable-exception-classes>
                        <batch:listeners>
                            <batch:listener ref="batchSkipListener" />
                        </batch:listeners>
                    </batch:chunk>
                </batch:tasklet>
            </batch:step>
        </batch:partition>
    </batch:step>
    <batch:validator>
        <bean
            class="org.springframework.batch.core.job.DefaultJobParametersValidator">
            <property name="requiredKeys">
                <list>
                    <value>batchRunNumber</value>
                    <value>creation_start_date1</value>
                    <value>creation_start_date2</value>
                </list>
            </property>
        </bean>
    </batch:validator>
</batch:job>



<bean id="timesheetWriter" class="com.tpf.writer.TimeWriter"
    scope="step">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="timeProcessor"
    class="com.tpf.processor.TimeProcessor" scope="step">
    <property name="dataSource" ref="oracledataSource" />
</bean> 

1 Ответ

0 голосов
/ 14 января 2019

Я думаю, что вы столкнулись с проблемой, о которой сообщалось в BATCH-2351 .

Вы можете попытаться предоставить параметр задания через XML вместо аннотации (поскольку большая часть вашей конфигурации основана на XML):

<bean id="timeProcessor" class="com.xyz.processor.TimeProcessor" scope="step">
   <property name="dataSource" ref="oracledataSource" />
   <property name="batchRunNumber" value="#{jobParameters['batchRunNumber']}" />
</bean>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...