Spring Boot 春批不领料任务执行器

c9qzyr3d  于 2023-11-17  发布在  Spring
关注(0)|答案(1)|浏览(111)

这是我的spring batch配置:

  1. @RequiredArgsConstructor
  2. @Configuration
  3. @Slf4j
  4. @EnableBatchProcessing
  5. public class SpringBatchConfig {
  6. private final JobBuilderFactory jobBuilderFactory;
  7. private final StepBuilderFactory stepBuilderFactory;
  8. @Autowired
  9. @Lazy
  10. private CRMTService crmtService;
  11. @Bean
  12. public TaskExecutor myTaskExecutor() {
  13. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  14. executor.setCorePoolSize(10);
  15. executor.setMaxPoolSize(15);
  16. executor.setQueueCapacity(100);
  17. executor.setThreadNamePrefix("Batch-");
  18. executor.initialize();
  19. return executor;
  20. }
  21. @Bean
  22. public Step step() {
  23. return stepBuilderFactory.get("step")
  24. .<String, String>chunk(10)
  25. .reader(itemReader())
  26. .processor(itemProcessor())
  27. .writer(itemWriter())
  28. .taskExecutor(myTaskExecutor())
  29. .build();
  30. }
  31. @Bean
  32. public Job job() {
  33. return jobBuilderFactory.get("job")
  34. .start(step())
  35. .build();
  36. }
  37. @Bean
  38. @StepScope
  39. public ItemReader<String> itemReader() {
  40. List<String> list = crmtService.getVertrags();
  41. return new IteratorItemReader<>(list != null ? list.iterator() : Collections.emptyIterator());
  42. }
  43. @Bean
  44. @StepScope
  45. public ItemProcessor<String, String> itemProcessor() {
  46. return item -> {
  47. //Logic -> This calls a method in service class. In that method I am calling an API for each string and saving the response to mongodb.
  48. return item;
  49. };
  50. }
  51. @Bean
  52. @StepScope
  53. public ItemWriter<String> itemWriter() {
  54. return items -> {
  55. //If we plan to log do anything in future
  56. };
  57. }
  58. }

字符串
Jdk版本11
Sping Boot 版本2.6.3
我要在我的服务课上启动这个 Spring 批次。
当我不使用task executor时,我可以在mongodb中获取所有产品(214)[使用单线程我可以获取所有产品,但显然需要时间]。当我使用task executor时,我错过了1或2个产品(212/213)。
还有两个有趣的观察:
当spring batch被触发时,这些是我在控制台中获得的日志:

  1. WARN [] 9758 --- [onPool-worker-1] o.s.b.c.c.a.DefaultBatchConfigurer : No datasource was provided...using a Map based JobRepository
  2. WARN [] 9758 --- [onPool-worker-1] o.s.b.c.c.a.DefaultBatchConfigurer : No transaction manager was provided, using a ResourcelessTransactionManager
  3. INFO [] 9758 --- [onPool-worker-1] o.s.b.c.l.support.SimpleJobLauncher : **No TaskExecutor has been set, defaulting to synchronous executor**.


即使我已经在步骤bean中设置了任务执行器。我还是得到了这个消息。
当spring batch真正开始时,正在运行的线程来自myTaskExecutor”,因为在控制台中我可以看到线程的名称以“Batch”开头,这是我在spring batch config class中添加的前缀。

  1. [ Batch-1] c.t.openapi.crmt.conf.SpringBatchConfig : Processing 123
  2. [ Batch-3] c.t.openapi.crmt.conf.SpringBatchConfig : Processing 456
  3. [ Batch-2] c.t.openapi.crmt.conf.SpringBatchConfig : Processing 789


问题1:为什么即使我显式定义了任务执行器,也找不到它?
问题2:如果没有选择,那么为什么spring batch中的线程以“Batch-”开头
即使我使用这个而不是任务执行器:

  1. @Bean
  2. public Step step() {
  3. return stepBuilderFactory.get("step")
  4. .<VertragsListe, VertragsListe>chunk(10)
  5. .reader(itemReader())
  6. .processor(itemProcessor())
  7. .writer(itemWriter())
  8. .taskExecutor(new SimpleAsyncTaskExecutor())
  9. .build();
  10. }


我仍然得到“未找到任务执行者”。

bfhwhh0e

bfhwhh0e1#

我认为这与WriterExecutor有关,尝试使用上下文处理器调试API,对我有效

相关问题