当前位置: 首页 > 知识库问答 >
问题:

Spring批处理中的数据中间作业分区

哈扬
2023-03-14

第1步--第一步从数据库中读取某些事务,并生成一个记录ID列表,这些记录ID将通过jobContext属性发送到第2步。

步骤2-这应该是一个分区步骤:从步骤应该基于从步骤1获得的列表进行分区(每个线程从列表中获得不同的Id),并在不相互干扰的情况下执行它们的读/处理/写操作。

我的问题是,尽管我希望根据步骤1产生的列表对数据进行分区,但spring在步骤1开始之前就配置了步骤2(因此调用了分区器的partition()方法),所以我不能按时注入分区标准。我尝试在partitioner bean上使用@stepscope,但它仍然试图在作业开始之前创建分区。

是否有一种方法可以在运行时动态地创建步骤分区,或者有另一种方法可以根据步骤1提供的列表将一个步骤划分为多个线程?

一些背景:

我正在使用spring batch处理一个批处理作业,它必须处理存储在数据库中的事务。每个事务都绑定到一个帐户(在不同的表中),该帐户有一个accountBalance,该帐户在处理事务时也需要更新。

但是,在获得要处理的事务列表并从中提取列表之前,我无法知道哪些AccountID需要处理,因此我需要能够在运行时提供要分区的列表。这就是为什么我认为我可以在前一步生成列表,然后在下一步进行分区并相应地处理数据。

我采取的方法在这种设置下是否合理?还是我应该寻找一个不同的解决方案?

共有1个答案

瞿健
2023-03-14

我找不到一种方法来像我想的那样在工作中对数据进行分区,所以我不得不使用以下变通方法:

我没有将作业分成两个步骤,而是将步骤1(“设置步骤”)中的逻辑移到返回要处理的事务列表的服务方法中,并在分区器的partition()方法中添加了对该方法的调用,从而允许我根据返回的列表创建分区。

在我的例子中,这也得到了同样的结果,尽管我仍然想知道是否可以在工作中配置分区,因为如果我必须在安装步骤中执行更复杂的处理或写入,并且需要配置异常处理策略等,那么这个解决方案就不起作用了。如果设置步骤放在步骤链的中间而不是开始,也可能不起作用。

 类似资料:
  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

  • 我正在使用Spring batch进行批处理,在进行批处理之前,我想验证所有作业参数,如productName、productID、开始日期、结束日期、productType,如果这些作业参数为null或包含错误值,我必须使验证步骤失败,并使作业失败。 我已经编写了验证步骤和Tasklet,在我的Tasklet中,我计划处理作业参数验证(对所有作业参数执行空检查)。因为我是第一次做Spring批处

  • 在这个应用程序中,我使用了Spring Data JPA。它是另一个使用Spring Batch并创建这些表的应用程序。换句话说,我只想运行一个连接查询,并将它直接映射到我的定制对象,只需要一些必要的字段。在可能的范围内,我希望避免为这两个表制作分开的模型。但我不知道这里最好的方法。

  • 我当前正在命令行中传递文件名在spring批处理作业中的参数并运行我的作业,spring批处理作业将查找文件并读取、处理和写入该文件。我目前在读取器中的作业参数文件名和读取器文件名,如何才能在处理器和写入器中使用相同的作业参数文件名。

  • 我有一个Spring批处理tasklet,我不知道如何从中失败。我想检查某些参数,如果它们不存在,则在该步骤中使作业失败。 注释掉的行是我试图让工作退出的行。有人有过这样的经历吗?

  • 如果我有两个作业,每个作业都写入不同的数据源,那么在它使用的数据源中写入Spring批处理元数据(jobExecution、结果、...)是有意义的。然而,Spring批处理似乎指示您有一个“主要”数据源用于该元数据。 我定义了两个数据源,都没有标记为主数据源,应用程序无法启动: 我尝试创建两个配置,每个配置都扩展DefaultBatchConfigrer: 另一个完全相同,只是工作和数据源不同。