在 JobRepository 中检测到现有事务 - Spring 使用 Grails 插件进行批处理
Existing transaction detected in JobRepository - Spring Batch with Grails Plugin
每次我开始我的批处理作业时,它都会抛出一个 IllegalStateException 并说它在 JobRepository 中检测到一个事务。我做了一些研究并删除了代码中的所有 @Transactional
注释。
我使用 Grails Spring 批处理插件 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
}
}
Grails 服务默认是事务性的。您可以使用 @Transactional
自定义整个 class 或每个方法的设置,但如果您没有注释,则与具有 class-scope Spring [=11] 相同=]注解.
要使您的服务成为非事务性服务,请添加 static transactional = false
,例如
class BatchTestService {
static transactional = false
def springBatchService
...
}
}
每次我开始我的批处理作业时,它都会抛出一个 IllegalStateException 并说它在 JobRepository 中检测到一个事务。我做了一些研究并删除了代码中的所有 @Transactional
注释。
我使用 Grails Spring 批处理插件 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
}
}
Grails 服务默认是事务性的。您可以使用 @Transactional
自定义整个 class 或每个方法的设置,但如果您没有注释,则与具有 class-scope Spring [=11] 相同=]注解.
要使您的服务成为非事务性服务,请添加 static transactional = false
,例如
class BatchTestService {
static transactional = false
def springBatchService
...
}
}