Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在已经分区的步骤中禁用块?_Java_Spring_Spring Batch - Fatal编程技术网

Java 如何在已经分区的步骤中禁用块?

Java 如何在已经分区的步骤中禁用块?,java,spring,spring-batch,Java,Spring,Spring Batch,假设我有100个城市,每个城市都有感兴趣的对象 对象的数量多种多样,范围从0到N 可以从读取列表中删除对象。这意味着它们不再处于活动状态,我应该禁用它们。因此,我首先禁用城市中的所有对象-从编写器开始,然后重新激活那些仍然在列表中的对象,因为我必须更新它们 我使用SpringBatch读取每个城市的对象并将它们写入数据库。我已经对这个步骤进行了分区,所以每个城市的数据都是在它自己的从属步骤中读取和写入的 我唯一的问题就是分块。即使步骤是分区的,我也看不到任何禁用分块的选项。 这是一个问题,因为城

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

对象的数量多种多样,范围从0到N

可以从读取列表中删除对象。这意味着它们不再处于活动状态,我应该禁用它们。因此,我首先禁用城市中的所有对象-从编写器开始,然后重新激活那些仍然在列表中的对象,因为我必须更新它们

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

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

SpringBatch是一个非常棒的工具,它几乎满足了我的所有需求,但现在我想知道,它是否适合这份工作

比如说,我们有两个城市: id1城市1 id2城市2

每个城市都有自己的目标。对象可以是活动的,也可以是非活动的。每个都绑定到一个城市(对不起,Stackoverflow似乎不支持任何类型的表)

我只能从reader获取当前活动的对象:

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);
}