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

Spring Batch从Rest web服务读取大量数据

马嘉勋
2023-03-14
import org.springframework.batch.item.ItemReader;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.List;

class RESTDataReader implements ItemReader<DataDTO> {

private final String apiUrl;
private final RestTemplate restTemplate;

private int nextDataIndex;
private List<DataDTO> data;

RESTDataReader(String apiUrl, RestTemplate restTemplate) {
    this.apiUrl = apiUrl;
    this.restTemplate = restTemplate;
    nextDataIndex = 0;
}

@Override
public DataDTO read() throws Exception {
    if (dataIsNotInitialized()) {
        data = fetchDataFromAPI();
    }

    DataDTO nextData = null;

    if (nextDataIndex < data.size()) {
        nextData = data.get(nextDataIndex);
        nextDataIndex++;
    }
    else {
        nextDataIndex= 0;
        data = null;
    }

    return nextData;
}

private boolean dataIsNotInitialized() {
    return this.data == null;
}

private List<DataDTO> fetchDataFromAPI() {
    ResponseEntity<DataDTO[]> response = restTemplate.getForEntity(apiUrl,
            DataDTO[].class
    );
    DataDTO[] data= response.getBody();
    return Arrays.asList(data);
}
}

例如:如果我在01012020和01012021之间调用它,我将获得8000万个数据。

PS:web服务按一天的分页方式工作,也就是说,如果我想检索01/09/2020到07/09/2020之间的数据,我必须调用它几次(01/09-02/09之间,然后02/09-03/09之间,依此类推,直到06/09-07/09)

在这种情况下,如果数据很大,我的问题是堆空间内存。

共有1个答案

严阳秋
2023-03-14

由于您的web服务不会在一天内提供分页,因此您需要确保调用该web服务的进程(即您的Spring批处理作业)有足够的内存来存储该服务返回的所有项。

例如:如果我在01012020和01012021之间调用它,我将获得8000万个数据。

这意味着,如果在没有足够内存保存结果的计算机上使用curl调用此web服务,则curl命令将失败。这里我想指出的一点是,解决这个问题的唯一方法是为运行Spring批处理作业的JVM提供足够的内存来容纳如此大的结果集。

 类似资料:
  • 我有一个springbatch应用程序,我将连接到一个网络数据库进行阅读。我发现的大多数示例都嵌入了数据库,用于独立测试。我不想那样做。我不确定配置是否类似。以下是我所拥有的最具德国特色的部分(带有一些异议): ,然后从应用程序启动: 我没有配置数据源。我不确定,因为我的基本上只是一个到远程网络数据库的客户端连接,它的配置是否会与我找到的各种示例的嵌入式设置不同。所以我自然会出错(如下)。我只是在

  • 问题内容: 我试图读取就是BEING柏油,流媒体,以标准输入存档,但我不知怎么读 远远 在管道的数据超过焦油发送。 我这样运行我的命令: 源代码是这样的: 对于100MB的涂油文件夹,我将获得1468个4MB的块(即6.15GB)!此外,数组的大小似乎无关紧要:如果将块大小设置为40MB,我仍然会获得约1400个40MB数据块,这根本没有意义。 要使用Go正确读取数据,我需要做些什么吗? 问题答案

  • 我在生产环境中使用redis server,在HA中使用redis Sentinel。但是阅读文档,当客户机连接到sentinel时,sentinel将主redis服务器提供给客户机。 是所有的读写操作都在主服务器上进行,而从服务器只用于故障转移,还是我们可以使用从服务器读取数据?

  • 问题内容: 我有包含以下格式的数字的文本文件: 现在,我需要读取该数据并将其分配给变量(前两个数字),并将其余所有数据( 1 000 000个 数字)分配给数组。 这不是一项艰巨的任务,但是-这太慢了。 我的第一次尝试是: 它按例外方式工作,但执行大约需要 7500毫秒 。我需要在几百毫秒内获取该数据。 然后我尝试了: 使用和我大约在 1700毫秒内 得到了相同的结果,但是仍然太多了。 如何在不到

  • 我正在从sftp服务器读取文件,并使用Spring Batch Framework将该文件加载到数据库中。下面是我的代码,但我遇到了一个错误 代码: 错误:

  • 我正在使用MongoDB构建一个架构。 我发现在辅助服务器上发送读取请求以满足统计需求是可能的(也是最佳实践)。结果将是一个更好的表现。 谢谢你的帮助。