gpt4 book ai didi

java - 如何在已经分区的步骤中禁用 block ?

转载 作者:行者123 更新时间:2023-12-02 00:09:31 24 4
gpt4 key购买 nike

假设我有 100 个城市,每个城市都有感兴趣的对象。

对象的数量各不相同,范围可以从 0 到 N。

可以从读取列表中删除对象。这意味着它们不再活跃,我应该禁用它们。所以我首先禁用城市中的所有对象 - 来自作者,然后我激活那些仍在列表中的对象,因为无论如何我都必须更新它们。

我使用 Spring Batch 读取每个城市的对象并将其写入数据库。我已经对这个步骤进行了分区,因此每个城市的数据都在它自己的从属步骤中读取和写入。

我遇到的唯一问题是分块。即使该步骤已分区,我也没有看到任何禁用分块的选项。这是一个问题,因为城市的最后一个 block 将禁用我在之前的 block 中激活的所有对象。

Spring Batch 是一个了不起的工具,几乎可以满足我的所有需求,但现在我想知道它是否适合这项特定的工作。

假设我们有 2 个城市:id1 城市1id2城市2

每个城市都有对象。对象可以是 Activity 的或非 Activity 的。每个都绑定(bind)到一个城市(抱歉,Stackoverflow 似乎不支持任何类型的表)。

object1 city1 active
object2 city1 active
object3 city1 inactive
object1 city2 active
object2 city2 inactive

我只能从阅读器获取当前 Activity 的对象:

object1 city1 active
object3 city1 active
object1 city2 active

含义 - 在我开始更新 Activity 对象之前,必须禁用数据库中的所有其他对象。

所以,我在作家中这样做:

CityObjectWriter(CityObjectRepository cityObjectRepository, cityId){
this.cityObjectRepository = cityObjectRepository;
this.cityId = cityId;
}

@Override
public void write(List<? extends CityObjectData> cityObjectData) throws Exception{
//In this case i should do nothing
if (cityObjectData.isEmpty) return;
cityObjectRepository.disableObjectsByCityId(cityId);
List<CityObject> cityObjects = cityObjectRepository.findAllByCity(cityId);
// Finds a matching existing cityObject and updates it with new data, if it's found
updateCityObjects(cityObjects, cityObjectData);
}

您看到这里的问题了吗?

因为 Spring Batch 将数据拆分为 block - 每 N 条记录将在它们自己的 write() 方法中写入。每次调用该方法都会停用其他所有内容。甚至是先前激活的记录。我不希望这样,除了将 block 大小设置为 9999999 之外,我没有看到任何解决方案,因此每个对象都在一个方法调用中处理。但总感觉有点脏。

最佳答案

我明白了。我可以使用 Tasklet,而不是读取器/处理器/写入器。使用微线程的步骤可以分为从属步骤以及具有读取器/写入器/处理器的常用步骤。它将在一次事务中读取、处理和记录城市的每个对象:

CityObjectImportTasklet(CityObjectRepository cityObjectRepository, cityId){
this.cityObjectRepository = cityObjectRepository;
this.cityId = cityId;
}

@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext context) throws Exception {
List<CityObjectData> cityObjectData = getCityObjectDataSomehow(cityId);

//In this case i do nothing
if (cityObjectData.isEmpty) return;

//disable all existent objects, to activate them later in case they're present
cityObjectRepository.disableObjectsByCityId(cityId);

List<CityObject> cityObjects = cityObjectRepository.findAllByCity(cityId);
// Finds a matching existing cityObject and updates it with new data, if it's found
updateCityObjects(cityObjects, cityObjectData);
}

关于java - 如何在已经分区的步骤中禁用 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58131928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com