【问题标题】:Spring batch item writer rest APISpring批处理项目编写器休息API
【发布时间】:2021-11-19 02:22:30
【问题描述】:

是否可以在 Spring 批处理项目中使用 RestAPI (REST TEMPLATE) 从 DB 中读取数据,对其进行处理并在 ItemWriter 中发送到另一个系统?我能看到的只是获取数据并将其写入 csv 文件。

【问题讨论】:

  • Web 服务仅响应 http 调用,在您的 http 调用中您可以调用其他 api 或其他 http web url。但是如果你说的是从数据库读取并返回web ui或者过程很简单,让我们知道更清楚的问题
  • @Popeye ,所以基本上我正在从事一个项目,我必须从数据库中获取数据并将其发送到另一个下游系统,而不是 Web UI。系统 A 触发批处理从 DB 中获取数据并将其发送到系统 B,系统 B 将在那里处理数据。
  • 您可以创建一个发送 REST 请求的自定义编写器,如“Asif A Fasih”的答案所示(除了执行 POST 或 PUT 操作而不是 GET,因为这通常是项目编写器确实)。
  • 感谢@MahmoudBenHassine,我向 Asif 提出了一个后续问题,并让我也这样对你。 “我必须循环发送有效载荷,等待第一个有效载荷的响应会增加时间并阻止我们发送第二个有效载荷,直到没有收到第一个有效载荷的响应,有什么方法可以原子地并发发送有效载荷列表??”

标签: spring-boot spring-batch spring-rest spring-resttemplate itemwriter


【解决方案1】:

可以创建自己的自定义ItemWriter

在您的情况下,请将spring-boot-starter-web 依赖项添加到您的pom.xmlbuild.gradle

例子:

package com.example.batch;

import lombok.extern.log4j.Log4j2;
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@Log4j2
public class RestItemWriter implements ItemWriter<String> {
    @Autowired
    RestTemplate restTemplate;

    public RestItemWriter(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @Override
    public void write(List<? extends String> items) throws Exception {
        ResponseEntity<Users> users = restTemplate.getForEntity("https://jsonplaceholder.typicode.com/users/1", Users.class);

        log.info("Status code is: " + users.getStatusCode());
    }
}


package com.example.batch;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Users {

    public String id;
    public String name;
    public String username;
    public String email;
    public String phone;
}

有关自定义项目编写器here的更多信息

【讨论】:

  • 谢谢@Asif,我必须循环发送有效载荷,等待第一个有效载荷的响应会增加时间并阻止我们发送第二个有效载荷,直到没有收到第一个有效载荷的响应,任何方式我都可以发送列表有效载荷的原子和并发??
  • 是的,我调查过了,但我想知道这是否可以使用 CompleteableFuture 来完成?我已经看到很多将 CF 用于 DB 调用的示例,但没有用于 rest api 调用。有可能吗?
  • 是的,有可能。我发现这个博客有一些很好的例子 - twilio.com/blog/…
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多