Java 了解在web容器中启动Spring批处理作业

Java 了解在web容器中启动Spring批处理作业,java,spring,spring-batch,web-container,Java,Spring,Spring Batch,Web Container,我在阅读Spring批处理文档时发现,如果要从web容器高效地运行批处理作业,就必须使用TaskExecutor接口的不同实现(异步版本) 我假设Http请求将触发批处理作业。据我所知,当客户机通过JobLauncher接口的run方法启动作业时,客户机必须等待JobExecution对象返回,因为典型的批处理作业将在结束时运行数小时,如果作业同步执行,这可能不太可行。现在,AsyncTaskExecutor将在单独的线程中执行每个步骤,并立即返回状态未知的JobExecution对象 首先,请

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

我假设Http请求将触发批处理作业。据我所知,当客户机通过JobLauncher接口的run方法启动作业时,客户机必须等待JobExecution对象返回,因为典型的批处理作业将在结束时运行数小时,如果作业同步执行,这可能不太可行。现在,AsyncTaskExecutor将在单独的线程中执行每个步骤,并立即返回状态未知的JobExecution对象

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

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

谢谢,
再见

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

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


如果使用异步执行器,则对run方法的调用将立即返回。在此之后,doGet方法将返回,HTTP响应将发送到客户端,连接将关闭(假设没有HTTP保持活动)。

这取决于servlet在调用run方法并接收到返回的JobExecution对象后的操作。我将假设doget方法在调用run之后才返回

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


如果使用异步执行器,则对run方法的调用将立即返回。在此之后,doGet方法将返回,HTTP响应将发送到客户端,连接将关闭(假设没有HTTP保持活动)。

从Web容器中运行作业

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

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

一个例子如下:

@Controller
public class JobLauncherController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

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

从Web容器中运行作业

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

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

一个例子如下:

@Controller
public class JobLauncherController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

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

您能否提供一个示例,说明客户端将如何调用服务器来澄清您的问题?您好,我已经编辑了我的问题,并按照您的要求添加了示例。希望现在一切都清楚了。您能提供一个示例,说明客户端如何调用服务器来澄清您的问题吗?您好,我已经编辑了我的问题,并按照您的要求添加了示例。希望现在一切都清楚了。谢谢你的回复。在这种情况下,客户机将如何了解批处理执行的状态?或者在这种情况下是不可能知道的?您必须以自定义的方式解决这个问题。一种典型的方法是向客户机返回某种批处理标识符,然后客户机可以使用该标识符查询批处理的状态。我不理解这一点,AsyncTaskExecutor使用多线程