jvm Grails Spring批处理插件找不到作业

zxlwwiss  于 2022-11-07  发布在  Spring
关注(0)|答案(1)|浏览(158)

我正在使用Grails 3.3.7处理一个项目,我试图使用grails-spring-batch来使Spring Batch工作。就像文档示例中一样,我在grails-app/batch目录中创建了一个MySimpleJobBatchConfig.groovy文件,其中包含以下内容:

  1. import myapp.PrintMessageTasklet;
  2. beans {
  3. xmlns batch:"http://www.springframework.org/schema/batch"
  4. batch.job(id: 'mySimpleJob') {
  5. batch.step(id: 'logStart') {
  6. batch.tasklet(ref: 'printMessage')
  7. }
  8. }
  9. printMessage(PrintMessageTasklet) { bean ->
  10. bean.autowire = "byName"
  11. }
  12. }

src/main/groovy/myapp/PrintMessageTasklet.groovy中,PrintMessageTasklet的定义如下:

  1. package myapp
  2. import org.springframework.batch.core.StepContribution
  3. import org.springframework.batch.core.scope.context.ChunkContext
  4. import org.springframework.batch.core.step.tasklet.Tasklet
  5. import org.springframework.batch.repeat.RepeatStatus
  6. class PrintMessageTasklet implements Tasklet {
  7. RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) {
  8. println "Test"
  9. return RepeatStatus.FINISHED
  10. }
  11. }

下面是尝试在grails-app/services/myapp/SimpleJobService中启动作业的服务:

  1. package myapp
  2. import grails.gorm.transactions.Transactional
  3. import org.springframework.batch.core.JobParameters
  4. import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing
  5. @Transactional
  6. class SimpleJobService {
  7. def jobLauncher;
  8. def mySimpleJob;
  9. def launchSimpleJob() {
  10. jobLauncher.run(mySimpleJob, new JobParameters())
  11. }
  12. }

然而,当我运行launchSimpleJob时,我得到以下异常,告诉我mySimpleJob为空,尽管我已经在MySimpleJobBatchConfig.groovy文件中定义了它。

  1. java.lang.reflect.InvocationTargetException: null
  2. at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
  3. at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
  4. at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
  5. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
  6. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
  7. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
  8. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
  9. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
  10. at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
  11. at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
  12. at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
  13. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  14. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  15. at java.lang.Thread.run(Thread.java:750)
  16. Caused by: java.lang.IllegalArgumentException: The Job must not be null.
  17. at org.springframework.util.Assert.notNull(Assert.java:134)
  18. at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:94)
  19. at myapp.SimpleJobService.$tt__launchSimpleJob(SimpleJobService.groovy:14)
  20. at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
  21. at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
  22. at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
  23. at myapp.SimpleJobController.launch(SimpleJobController.groovy:9)
  24. ... 14 common frames omitted

如果我尝试使用springBatchService.launch('mySimpleJob')来启动作业,则返回的Map中的消息也会告诉我,它找不到名为“mySimpleJob”的作业。
由于我是Groovy和Spring Batch的新手,我仔细地阅读了这个插件的文档,我找不到哪里有问题。有人知道如何修复这个问题吗?

iqih9akk

iqih9akk1#

修复了它,插件文档过时了,原来我的BatchConfing需要在src/main/resources/batch文件夹中,而不是grails-app/batch文件夹。
也不得不改变@Transactional@Transactional(propagation = Propagation.NOT_SUPPORTED)在我的服务。

相关问题