Java 如何在已经分区的步骤中禁用块?
假设我有100个城市,每个城市都有感兴趣的对象 对象的数量多种多样,范围从0到N 可以从读取列表中删除对象。这意味着它们不再处于活动状态,我应该禁用它们。因此,我首先禁用城市中的所有对象-从编写器开始,然后重新激活那些仍然在列表中的对象,因为我必须更新它们 我使用SpringBatch读取每个城市的对象并将它们写入数据库。我已经对这个步骤进行了分区,所以每个城市的数据都是在它自己的从属步骤中读取和写入的 我唯一的问题就是分块。即使步骤是分区的,我也看不到任何禁用分块的选项。 这是一个问题,因为城市的最后一个区块将禁用我在以前区块中激活的所有对象 SpringBatch是一个非常棒的工具,它几乎满足了我的所有需求,但现在我想知道,它是否适合这份工作 比如说,我们有两个城市: id1城市1 id2城市2 每个城市都有自己的目标。对象可以是活动的,也可以是非活动的。每个都绑定到一个城市(对不起,Stackoverflow似乎不支持任何类型的表) 我只能从reader获取当前活动的对象:Java 如何在已经分区的步骤中禁用块?,java,spring,spring-batch,Java,Spring,Spring Batch,假设我有100个城市,每个城市都有感兴趣的对象 对象的数量多种多样,范围从0到N 可以从读取列表中删除对象。这意味着它们不再处于活动状态,我应该禁用它们。因此,我首先禁用城市中的所有对象-从编写器开始,然后重新激活那些仍然在列表中的对象,因为我必须更新它们 我使用SpringBatch读取每个城市的对象并将它们写入数据库。我已经对这个步骤进行了分区,所以每个城市的数据都是在它自己的从属步骤中读取和写入的 我唯一的问题就是分块。即使步骤是分区的,我也看不到任何禁用分块的选项。 这是一个问题,因为城
object1 city1 active
object3 city1 active
object1 city2 active
意思-在我开始更新活动对象之前,必须禁用数据库中的所有其他对象
因此,我在作者中这样做:
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);
}
CityObjectWriter(CityObjectRepository CityObjectRepository,cityId){
this.cityObjectRepository=cityObjectRepository;
this.cityId=cityId;
}
@凌驾
public void write(List我找到了它。我可以用Tasklet代替reader/processor/writer。
使用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);
}
CityObjectImportTasklet(CityObjectRepository CityObjectRepository,cityId){
this.cityObjectRepository=cityObjectRepository;
this.cityId=cityId;
}
@凌驾
公共RepeatStatus执行(StepContribution贡献,ChunkContext上下文)引发异常{
List cityObjectData=getCityObjectDataSomehow(cityId);
//在这种情况下,我什么也不做
if(cityObjectData.isEmpty)返回;
//禁用所有存在的对象,以便稍后在它们存在时激活它们
cityObjectRepository.disableObjectsByCityId(cityId);
List cityObjects=cityObjectRepository.findAllByCity(cityId);
//查找匹配的现有cityObject并使用新数据更新它(如果找到)
updateCityObjects(城市对象、城市对象数据);
}
现在还不清楚“禁用对象”和“禁用分块”是什么意思。您能否提供一个示例,说明您正试图实现什么,并共享您想要“禁用”分块的分区步骤的代码?@MahmoudBenHassine认为这是一个分区问题(设计问题),而不是Spring Batch中缺少的功能(“禁用”分块。您必须确保每个分区在不同的数据集上工作,以便每个记录仅由一个工作者处理一次。在您的示例中,按城市划分对象是一个选项。
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);
}