Spring batch Spring批处理错误(作业实例已存在),RunIdCrementer只生成一次

Spring batch Spring批处理错误(作业实例已存在),RunIdCrementer只生成一次,spring-batch,Spring Batch,我使用springbatch&Quartz从数据库表中读取数据并写入另一个表。数据库是Oracle,它是c3p0 问题是每个作业都必须有唯一的参数,我尝试了,我尝试了以下代码: public class JobRerunner implements JobParametersIncrementer { @Override public JobParameters getNext(JobParameters parameters) { System.out.pri

我使用springbatch&Quartz从数据库表中读取数据并写入另一个表。数据库是Oracle,它是c3p0

问题是每个作业都必须有唯一的参数,我尝试了,我尝试了以下代码:

public class JobRerunner implements JobParametersIncrementer {

    @Override
    public JobParameters getNext(JobParameters parameters) {
        System.out.println("got job parameters: " + parameters);
        if (parameters==null || parameters.isEmpty()) {
            return new JobParametersBuilder().addLong("run.id", System.currentTimeMillis()).toJobParameters();
        }
        long currentTime = parameters.getLong("run.id",System.currentTimeMillis()) + 1;
        return new JobParametersBuilder().addLong("run.id",currentTime).toJobParameters();
    }

}
但是我遇到了同样的问题,run.id只生成一次,当第二次运行作业时,它根本没有参数,第三次也没有参数(第二次和第三次运行JobParameter=null,所以作业实例已经存在)

工作环境

<batch:job id="readyReqPoolJob" restartable="true">
    <batch:step id="readyReqPoolStep">
        <batch:tasklet>
            <batch:chunk reader="readyReqPoolReader" writer="readyReqPoolWrtiter"
                commit-interval="100" />
        </batch:tasklet>
    </batch:step>
</batch:job>


<!-- ======================================================= -->
<!-- 6) READER -->
<!-- ======================================================= -->
<bean id="readyReqPoolReader"
    class="org.springframework.batch.item.database.JdbcCursorItemReader">
    <property name="dataSource" ref="dataSource" />
    <property name="sql" value="select * from SF_ILA_Ready_Request_Pool" />
    <property name="rowMapper" ref="ReadyReqPoolRowMapper" />
</bean>
<bean id="readyReqPoolWrtiter"
    class="com.housekeepingservice.readyrequestpoolarchive.ReadyReqPoolArchiveWriter" />


<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass"
        value="org.springframework.batch.sample.quartz.JobLauncherDetails" />
    <property name="jobDataAsMap">
        <map>
            <entry key="jobName" value="readyReqPoolJob" />
            <entry key="jobLocator" value-ref="jobRegistry" />
            <entry key="jobLauncher" value-ref="jobLauncher" />
        </map>
    </property>
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <bean id="cronTrigger"
            class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail" ref="jobDetail" />
            <property name="cronExpression" value="0 0/5 * * * ?" />
        </bean>
    </property>
</bean>
日志(在第一次运行和第二次运行中签出作业接收参数):


要与job Incremater共进午餐,你需要两样东西

  • 将RunidCremater附加到您的工作中
  • 使用知道使用增量的启动器
  • 我认为您不需要自己的实现,只需使用现有的实现即可。
    将RunidCremater附加到您的工作中。

    <batch:job id="readyReqPoolJob" incrementer="runIdIncrementer" restartable="true">
    </batch:job>
    <bean id="runIdIncrementer" 
    class="org.springframework.batch.core.launch.support.RunIdIncrementer"/>
    
    选项3:在Junit中,您可以使用JobLauncherTestUtils。
    请注意,它有自己的id增量,将忽略您使用的id增量

    另请参见下面的答案,例如添加一个名为'timestamp'的参数,或者-如果您想使用
    run.id
    -使用
    JobParametersCrementer
    bean定义来设置。

    将步骤
    AllowsArtifComplete
    标志设置为
    True

    我已经尝试过了,同样的问题发生了,然后我删除了它并使用了我的own incrementerI添加了更多细节,我希望现在能更清楚。感谢您的澄清,我做到了&结果是:首先,当我运行它时,我得到了“错误的SQL语法异常”,然后作业在没有参数的情况下运行了两次,第一次成功第二次“作业实例已存在并已完成”作业存储库和其他bean是否有任何特殊配置?CommandLineJobRunner应该替换您的主代码,例如java org.springframework.batch.core.launch.support.CommandLineJobRunner mainContext.xml readyReqPoolJob-next请进一步澄清?要使每次执行都是唯一的,请添加一个名为'将时间戳(例如)设置为当前作业参数,并将其设置为
    new Date().getTime()
    以便不会与旧作业执行发生冲突您的意思是:JobParameters JobParameters=new JobParameters builder().addLong(“time”,System.currentTimeMillis()).toJobParameters();我已经在尝试为每个作业指定一个唯一参数问题是唯一参数只生成一次,然后作业使用空参数执行,我甚至尝试了JobLauncherTestUtils类及其方法getUniqueJobParameters()但是同样的问题也发生了,您提到了bean定义,是否有关于bean定义的任何设置来解决这个问题?
    public class Test {
        public static void main(String[] args) {
    
            String[] springConfig = { "spring/batch/config/mainContext.xml" };
    
            ApplicationContext context = new ClassPathXmlApplicationContext(
                    springConfig);
            JobRerunner rerun = new JobRerunner();
    
            JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
    
            Job readyRequestPoolJob = (Job) context.getBean("readyReqPoolJob");
    
    
            try {
    
    
                JobParameters jobParameters = new JobParameters();
                 JobExecution execution2 = jobLauncher.run(readyRequestPoolJob, rerun.getNext(jobParameters));
    
                System.out.println("Exit Status : " + execution2.getStatus());
    
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            System.out.println("Done");
    
        }
    
    }
    
    17:00:27,053  INFO SimpleJobLauncher:132 - Job: [FlowJob: [name=readyReqPoolJob]] launched with the following parameters: **[{run.id=1393855226339}]**
    17:00:27.085 [Timer-0] DEBUG org.quartz.utils.UpdateChecker - Checking for available updated version of Quartz...
    17:00:27,272  INFO SimpleStepHandler:135 - Executing step: [readyReqPoolStep]
    17:02:08,791  INFO SimpleJobLauncher:135 - Job: [FlowJob: [name=readyReqPoolJob]] completed with the following parameters: [{run.id=1393855226339}] and the following status: [COMPLETED]
    17:10:00.005 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job DEFAULT.jobDetail
    17:10:00,008  INFO JobLauncherDetails:69 - Quartz trigger firing with Spring Batch jobName=readyReqPoolJob
    17:10:00,036  INFO SimpleJobLauncher:132 - Job: [FlowJob: [name=readyReqPoolJob]] launched with the following parameters: **[{}]**
    17:10:00,059  INFO SimpleStepHandler:135 - Executing step: [readyReqPoolStep]
    
    <batch:job id="readyReqPoolJob" incrementer="runIdIncrementer" restartable="true">
    </batch:job>
    <bean id="runIdIncrementer" 
    class="org.springframework.batch.core.launch.support.RunIdIncrementer"/>
    
    <bean id="jobOperator"
            class="org.springframework.batch.core.launch.support.SimpleJobOperator">
            <property name="jobRepository" ref="jobRepository" />
            <property name="jobLauncher" ref="jobLauncher" />
            <property name="jobRegistry" ref="jobRegistry" />
            <property name="jobExplorer" ref="jobExplorer" />
    </bean>
    
    jobOperator.startNextInstance(jobName)