【问题标题】:Understanding launching of Spring batch Jobs in a web container了解在 Web 容器中启动 Spring 批处理作业
【发布时间】:2011-10-04 07:20:07
【问题描述】:

我在阅读 Spring Batch 文档时发现如果我们必须高效地运行批处理作业,我们将不得不使用 TaskExecutor 接口的不同实现(异步版本)从网络容器。

我假设一个 Http 请求会触发批处理作业。据我了解,当客户端通过 JobLauncher 接口的 run 方法启动作业时,客户端必须等待返回 JobExecution 对象,因为一个典型的批处理作业最终会运行几个小时,如果这些作业是同步执行的,这可能不太可行。现在,AsyncTaskExecutor 将在单独的线程中执行每个步骤,并立即返回具有 UNKNOWN 状态的 JobExecution 对象。

首先,有人可以从客户端-服务器连接的角度向我解释一下这是如何工作的吗?在每种情况下,客户端在终止会话之前是否不会等待批处理完成?或者,客户端是否不知道批处理作业的退出状态?整个问题是否与必须保持连接直到批处理结束有关?

例如,假设客户端有一个网页,该网页发送一个 HTTP 获取请求,该请求由 servlet 的 doget 方法提供服务。此方法调用作业启动器的 run 方法。此方法将返回 JobExecution 对象。其余的故事如上。

谢谢, 阿迪亚。

【问题讨论】:

  • 您能否举例说明客户端如何调用服务器来澄清您的问题?
  • 嗨,我已经编辑了我的问题并添加了你问的例子。希望现在很清楚。

标签: java spring spring-batch web-container


【解决方案1】:

这在一定程度上取决于您的 servlet 在调用 run 方法并收到 JobExecution 对象作为回报之后会做什么。我假设 doget 方法只是在调用 run 后返回。

如果您使用异步执行器,则对作业启动器上的 run 方法的调用将同步执行。也就是说,调用将等到批处理作业完成并返回 JobExecution 对象。从连接的角度来看,客户端的 HTTP 连接将在整个批处理作业期间保持打开状态。 HTTP 连接将在 servlet 的 doGet 方法返回时关闭(或者在某些级别遇到某种超时之前,例如防火墙或套接字读取超时)。

如果您确实使用异步执行器,则对 run 方法的调用将立即返回。之后doGet方法会返回,将HTTP响应发送给客户端并关闭连接(假设没有HTTP keep-alive)。

【讨论】:

  • 感谢您的回复。在这种情况下,客户端如何知道批处理执行的状态?还是在这种情况下不可能知道?
  • 您必须以自定义方式解决该问题。一种典型的方法是向客户端返回某种批次标识符,然后客户端可以使用该标识符来查询批次的状态。
  • 我不明白这一点,AsyncTaskExecutor 使用 多线程 方法,因此必须生成多个线程来运行作业。现在,主线程(在其中调用 run 方法)将退出,这意味着连接已关闭。但这意味着这个过程也结束了,对吧?这是否意味着该进程的所有线程也将结束?这不是真的吗?连接关闭时,批处理作业如何仍在运行? [过程结束,即]。感谢您的回复。
  • 如果进程结束,那么批处理作业将不会运行,因为您是正确的。所以你需要一些方法来保持进程运行。如果您使用 servlet 启动批处理,那么您可能在 web 容器中运行,它不会因为请求连接关闭并且请求处理线程退出而退出。
  • @Aditya 有标准的方法可以让您在 Spring Batch 中检索作业执行状态,而无需任何“自定义方式”。根据您的需要,您可能只需要从JobExplorerJobOperator 甚至JobExecutionDao 等查询作业执行情况(但应该是JobExplorer 99% 的时间)
【解决方案2】:

在 Web 容器中运行作业

作业通常从命令行启动。但是,在许多情况下,从HttpRequest 启动是更好的选择。许多此类用例包括报告、临时作业运行和 Web 应用程序支持。因为根据定义,批处理作业是长时间运行的,所以最重要的问题是确保异步启动作业:

这里 Spring MVC 控制器使用已配置为异步启动的 JobLauncher 启动 Job,它立即返回 JobExecution。 Job 可能仍在运行,但是,这种非阻塞行为允许控制器立即返回,这是处理 HttpRequest 时所必需的。

下面是一个例子:

@Controller
public class JobLauncherController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    @RequestMapping("/jobLauncher.html")
    public void handle() throws Exception{
        jobLauncher.run(job, new JobParameters());
    }
}

source

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    相关资源
    最近更新 更多