在JobRepository中检测到现有事务 - 使用Grails插件进行Spring Batch

时间:2015-08-31 10:07:35

标签: grails spring-batch

每次启动批处理作业时,它都会抛出IllegalStateException,并说它在JobRepository中检测到了一个事务。我做了一些研究并删除了代码中的所有@Transactional注释。

我使用Grails Spring Batch Plugin你可以找到here,我使用Grails 2.3.11和Java 8.我的代码看起来像这样:

SimpleJobBatchConfig.groovy

beans {

    xmlns batch:"http://www.springframework.org/schema/batch"

    batch.job(id: 'simpleJob') {
        batch.step(id: 'printStep') {
            batch.tasklet(ref: 'printHelloWorld')
        }
    }

    printHelloWorld(SimpleJobTasklet) { bean ->
        bean.autowire = 'byName'
    }

}

BatchTestController.groovy

class BatchelorController {

    def batchTestService

    def index() {

    }

    def launchSimpleJob() {
        batchTestService.launchSimpleJob()
    } 
}

BatchTestService.groovy

class BatchTestService {

    def springBatchService

    def launchSimpleJob() {
        springBatchService.launch("simpleJob")
    }

}

SimpleJobTasklet.groovy

class SimpleJobTasklet implements Tasklet {

    @Override
    RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
        println("Hello World!")
        return RepeatStatus.FINISHED
    }

}

1 个答案:

答案 0 :(得分:1)

Grails服务默认是事务性的。您可以使用自定义整个类或每个方法的设置,但如果没有注释,则与具有类范围的Spring @Transactional注释相同。

要使您的服务成为非交易服务,请添加@Transactional,例如

static transactional = false