【问题标题】:How to use Spring Batch to connect to server?如何使用 Spring Batch 连接服务器?
【发布时间】:2018-09-10 17:29:33
【问题描述】:

对于我遇到的特定问题,我需要 经验丰富的 Spring Batch 程序员的帮助。

我是 Spring Batch 的新手。它为每个类或接口都有详细的文档,但几乎没有任何东西可以协同工作。

情景
我有一个托管在云上的数据库,所以我必须进行 REST 调用以从中获取一些数据并将相关数据保存到其中。
- 数据检索将返回带有我查询的数据的 JSON 响应。
- 数据保存将返回关于添加了多少行等的 JSON 响应。
- 所有响应都将具有有效的 HTTP 状态代码。
- 当保存调用成功,Http 代码为 200 并且接收到显示插入了多少条记录的数据时,事务完成。

连接可能并不总是可用,在这种情况下,程序必须每 5 分钟重试一次,直到整个任务完成。

我选择不做的事
我可以做一些肮脏的 Java 技巧(许多人在堆栈溢出中出人意料地推​​荐了这些技巧)

  1. 线程和睡眠(太粗糙了)
  2. Spring 的 @Scheduled(即使在作业完成后调度程序也会继续运行)

我尝试了什么
所以我决定使用 Spring Batch,因为它似乎是为此而设计的框架。

  1. 我没有文件任务,所以我使用了 Tasklet 而不是 Readers 和 作家。

  2. Tasklet 接口只能返回 FINISHED 状态码。没有代码 失败

  3. 因此,在 tasklet 中,我在 StepContext 中设置了一个自定义值并检索了我的自定义 StepExecutionListener 中的值并相应地配置 失败步骤的存在状态

  4. 为了处理这个变通方法,我必须配置一个 JobExecutionListener 使作业相应地失败。

除了以上所有这些变通方法,

  1. 春季批处理没有任何调度。我必须最终使用 另一个调度程序。
  2. Spring Batch 在一个步骤内的重试仅有效 用于 ItemReader、ItemWriter 等,而不用于小任务

问题

  1. Spring Batch 适合这种情况吗?

  2. 我的设计正确吗?看起来很“hack”-ey。

我需要帮助以最有效的方式处理我的场景

【问题讨论】:

  • 这个你使用的另一个调度器,它不是在作业完成后继续运行吗?
  • I have to make REST calls to get some data from it and save related data to it REST 调用返回什么样的数据?结果有多大?你打算在哪里保存数据? The connection may not always be available, In that case the program must keep retrying every 5 minutes until the whole task is complete. 您能否定义何时考虑该任务complete?这对于在 Spring Batch 中实现 CompletionPolicy 很重要
  • 从您列出的要求来看,我认为不需要 Spring Batch。想必您可以创建一个@Scheduled 方法来连接到云REST 服务,并在此方法中实现自己的重试逻辑,以防连接或业务逻辑失败。我不太明白您不愿意使用调度程序(即使在作业完成后调度程序也会继续运行)——这就是调度程序的用途。
  • @MahmoudBenHassine 我已经更新了我的问题。来自服务器的响应数据的大小相对较小,并且是 JSON 格式。所有保存操作都是对服务器的 Http POST 调用。最后,当最终保存操作返回 http 代码 200(而不是在网络故障的情况下超时)时,操作完成。我很想听听你在春季批次中处理这种情况的方法
  • 总有办法实现自定义模块。我是一名学生,想了解更多关于可以做到这一点的标准框架。 @Scheduled 会导致可伸缩性问题。想象一下,在很久以前完成请求后,仍有 100 万个调度程序每 5 分钟运行一次。

标签: java spring spring-boot spring-batch spring-retry


【解决方案1】:

我在类似情况下使用 Spring Batch - 作为执行引擎来处理导致对其他系统的大量 REST 请求的大文件。

Spring 批次为我带来了什么:

  • 大型相关操作的执行引擎/模型。换句话说,我可以将我的输入保持为一个单一的入口点,并在其他小型操作之上进行“巨大”交易。
  • 可以查看执行结果并对其进行监控。
  • 批处理操作的可重试性。这是春季批次中最好的事情之一
  • 它允许您以这样的方式设计您的操作,如果在执行过程中出现问题,您可以简单地重新启动它并从故障点继续。但是您需要投入一些精力来维持这一点。

更多关于商业案例的信息:https://docs.spring.io/spring-batch/trunk/reference/html/spring-batch-intro.html#springBatchUsageScenarios

因此,您需要仔细检查这些业务案例,并在您确实需要它们时自行回答。 到目前为止,您所描述的-我真的看不到春季批次对您的好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2013-02-19
    相关资源
    最近更新 更多