每次启动批处理作业时,它都会抛出IllegalStateException,并说它在JobRepository中检测到了一个事务。我做了一些研究并删除了代码中的所有@Transactional
注释。
我使用Grails Spring Batch Plugin你可以找到here,我使用Grails 2.3.11和Java 8.我的代码看起来像这样:
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'
}
}
class BatchelorController {
def batchTestService
def index() {
}
def launchSimpleJob() {
batchTestService.launchSimpleJob()
}
}
class BatchTestService {
def springBatchService
def launchSimpleJob() {
springBatchService.launch("simpleJob")
}
}
class SimpleJobTasklet implements Tasklet {
@Override
RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
println("Hello World!")
return RepeatStatus.FINISHED
}
}
答案 0 :(得分:1)
Grails服务默认是事务性的。您可以使用自定义整个类或每个方法的设置,但如果没有注释,则与具有类范围的Spring
@Transactional
注释相同。
要使您的服务成为非交易服务,请添加@Transactional
,例如
static transactional = false