1

一度問題なく実行されるSpringBatchジョブを定義しました。ただし、JOB_INSTANCE_IDの主キーのエントリが重複しているため、2回目の実行はできません。

SEVERE: Job Terminated in error: PreparedStatementCallback; SQL [INSERT into    BATCH_JOB_INSTANCE(JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) values (?, ?, ?, ?)]; Duplicate entry '0' for key 'PRIMARY'; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'

これは、ジョブにコマンドラインパラメータを設定することで克服できることを読みました。

java -cp ${CLASSPATH} org.springframework.batch.core.launch.support.CommandLineJobRunner myJob.xml myJob date=20121025154016 -next

-nextパラメーターを含めるかどうかに関係なく、ジョブは実行されません。

私のSpringBatch構成は次のようになります(batch / launchContext.xml)。

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xmlns:jdbc="http://springframework.org/schema/jdbc"
    xsi:schemaLocation="http://www.springframework.org/schema/jdbc     http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
    http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd
http://springframework.org/schema/jdbc http://springframework.org/schema/jdbc/spring-jdbc.xsd
    http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- Launch context: how to launch all of the jobs -->
    <!-- Expects a data source configuration file to be used, with a DataSource bean 
called "dataSource" -->

    <!-- The data source for the jobs status -->
    <import resource="dataSource.xml" />

    <bean
            id="jobRepository"                        
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
            <property
                    name="dataSource"
                    ref="dataSource" />
            <property
                    name="databaseType"
                    value="MySQL" />
            <property
                    name="transactionManager"
                    ref="transactionManager"></property>
    </bean>

    <bean
            id="incrementer"
            class="org.springframework.batch.core.launch.support.RunIdIncrementer" />

    <bean
            id="jobLauncher"
            class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
            <property
                    name="jobRepository"
                    ref="jobRepository" />
    </bean>

    <bean
            id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property
                    name="dataSource"
                    ref="dataSource" />
    </bean>

    <bean
            id="jobExplorer"       
class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean">
            <property
                    name="dataSource"
                    ref="dataSource" />
    </bean>

</beans>

そして、ジョブは次のようになります(myJob.xmlファイル内)

....
<import resource="batch/launchContext.xml" />
...
    <batch:job
            id="myJob"
            job-repository="jobRepository"
            incrementer="incrementer">
            <batch:step id="step1">
                    <batch:tasklet transaction-manager="transactionManager">
                            <batch:chunk
                                    reader="myReader"
                                    processor="myProcessor"
                                    writer="myWriter"
                                    commit-interval="10" />
                    </batch:tasklet>
            </batch:step>
    </batch:job>

理想的には、ジョブの各実行が実行日時で永続化されることです。これを自動的に行うようにランチャーを構成する方法はありますか?

4

1 に答える 1

7

私はこの質問を公式の春のフォーラムにも載せました。そして、私は最終的に自分自身の答えを見つけました(途中でヒントがあります)。

http://forum.springsource.org/showthread.php?131347-How-to-re-run-a-job&p=428484#post428484

つまり、問題は、これら3つのテーブルから値「0」を削除したことです。

  • BATCH_STEP_EXECUTION_SEQ
  • BATCH_JOB_EXECUTION_SEQ
  • BATCH_JOB_SEQ

したがって、Spring Batchメタデータテーブルをクリーンアップするとき(たとえば、truncateまたはdelete from ...を使用)、次のコマンドが後で実行されることを確認してください。

INSERT INTO BATCH_STEP_EXECUTION_SEQ values(0);
INSERT INTO BATCH_JOB_EXECUTION_SEQ values(0);
INSERT INTO BATCH_JOB_SEQ values(0);
于 2012-10-30T08:15:59.837 に答える