我有一个Spring Batch工作。我是Spring Batch的新手,并且一直通过CommandLineJobRunner调用。
这就是我的电话:
org.springframework.batch.core.launch.support.CommandLineJobRunner spring-batch-myProject.xml SpringJobBean.MyProjectImportDataJob
现在我必须从Web服务(Spring MVC)中调用我的批处理作业。在我的端点中,这是调用调用。我需要在if语句中调用批处理作业。我该怎么做?我读到了JobLauncher ......但不知道如何告诉它要发布什么?
protected Object invokeInternal(Object aObj) throws Exception {
RunDataProcessingImportRequest request = (RunDataProcessingImportRequest) aObj;
RunDataProcessingImportResponse response = new RunDataProcessingImportResponse();
if (request.getDataProcessingType().equals(PROJECT_TYPE)){
response.setResultCd(1);
} else {
response.setResultCd(0);
response.setErrorCode(1l);
response.setErrorMessage("Incorrect process type");
}
return response;
}
答案 0 :(得分:1)
这个问题的答案实际上取决于您正在使用的Spring Batch的版本。
如果您使用的是2.0.x或更早版本,则可以使用Spring Batch Admin为启动/停止/ etc作业提供REST端点。您需要做的就是将罐子添加到您的应用程序并提供少量配置。
如果您使用的是2.2.x或更高版本,并且允许使用Spring Batch Admin的快照版本,则同样适用于上述内容。
如果您对使用Spring Batch Admin不感兴趣,则需要编写自己的端点并从那里启动作业。但是,它应该是相当微不足道的(我还没有测试下面的代码):
@Controller
public class JobLaunchingController {
@Autowire
JobLauncher jobLauncher;
@Autowire
JobRegistry jobRegistry;
@RequestMapping("/launch")
public @ResponseBody JobExecution launch(
@RequestParam(value="name", required=true) String name,
@RequestParam(value="params", required=false) String params) {
Job job = jobRegistry.getJob(name);
JobParametersBuilder paramsBuilder = new JobParametersBuilder();
if(params != null) {
// parse job parameters
}
return jobLauncher.run(job, paramsBuilder.toJobParameters());
}
}
上面的代码假设您有多个作业来提供执行能力。如果不是,您可以@Autowire
Job
将JobRegistry
本身插入您的控制器中(而不是JobLauncher
)。
您可以在此处阅读有关Spring服务的更多信息:https://spring.io/guides/gs/rest-service/
您可以在此处详细了解JobRegistry
:http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/core/launch/JobLauncher.html
最后,您可以在此处的第4.6.2节中详细了解{{1}}:http://docs.spring.io/spring-batch/reference/html/configureJob.html