1

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

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

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

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

谢谢,阿迪亚。

4

2 回答 2

4

这在一定程度上取决于您的 servlet 在调用 run 方法并收到 JobExecution 对象作为回报后所做的事情。我将假设doget方法在 run 被调用后才返回。

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

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

于 2011-10-04T13:19:18.787 回答
0

从 Web 容器中运行作业

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

在此处输入图像描述

这里 Spring MVC 控制器使用JobLauncher已配置为异步启动的 a 启动一个 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());
    }
}

资源

于 2017-06-19T01:40:44.607 回答