我已经创建了春季批处理作业,并为启动相同的我们提供了rest客户端,它将在url中传递作业名称。例:http://localhost: 8080/ProjectName/发射器/工作/updateFeedsJob这个url将启动updateFeedsJob作业。现在的问题是在点击url之后,同一个作业正在运行多个
Times(5),在tomcat7中部署相同的代码后,在Unix中每分钟一次
而在本地它运行良好。此外,整个工作将在大约4-5分钟内完成。我在谷歌上搜索了很多,但没有合适的解决方案。
任何建议。
代码:发射器类:
@Path("/launcher")
public class LaunchController {
static String[] springConfig = { "spring/batch/jobs/job-update*.xml" };
@GET
@Path("/semjobs/{jobname}")
@Produces("application/xml")
public Response getScmJobs(@PathParam("jobname") String jobname) {
{
JobDetails jobdetails = new JobDetails();
ApplicationContext context = new ClassPathXmlApplicationContext(springConfig);
JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
String category = EMPTY_STRING;
jobdetails.setJobname(jobname);
Job job = (Job) context.getBean(jobname);
JobExecution executionall = null;
String inputpath = EMPTY_STRING;
try {
inputpath = loadPropertiesFile(jobname);
} catch (Exception e) {
LOGGER.error("Error occured while loading the properties file -> " + e);
}
executionall = jobLauncher.run(job, new JobParametersBuilder().addString("inputFile", inputpath).addDate("date", new Date()).toJobParameters());
if (executionall != null) {
jobdetails.setJobstatus(executionall.getExitStatus().getExitCode());
jobdetails.setJobid(executionall.getJobId());
}
} catch (Exception e) {
LOGGER.error("Error occured while launching the job -> " + e);
}
return Response.status(200).entity(jobdetails).build();
}
Spring批处理作业通常与flatfileitemreader(从csv中读取),processor(更新adwords api提要细节)一起使用,此步骤大约需要花费2个小时。对于CSV文件中的每条记录(大约有40条记录)和自定义的写入器,该写入器正在更新db中的记录。
web . xml
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- Auto scan REST service -->
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
我可能有一个解决方案-但它不是合适的。
你可以在你的主作业中添加一个作业列表,从而结束你的应用程序
您可以在该侦听器的after-job方法中调用System.Exit(0) -