【问题标题】:Calling Spring Batch from java code从 java 代码调用 Spring Batch
【发布时间】:2012-02-22 13:58:15
【问题描述】:

以下是我的要求。

  1. 有一个屏幕,用户在其中输入文件名并单击提交。

  2. 点击 submit 时,必须触发 spring 批处理作业。批处理作业读取文件并填充数据库。

我们如何从 java 代码(特别是从 struts 动作类代码)调用 spring 批处理作业?

另外,我需要将文件名(用户在屏幕上输入的)传递给批处理程序。我们如何做到这一点?

【问题讨论】:

    标签: java spring struts2 spring-batch


    【解决方案1】:

    作业启动器

    Spring Batch 作业通过 JobLauncher 启动(例如运行)。启动器的实现之一是由您可以开箱即用的框架提供的:SimpleJobLauncher。查看文档的Configuring a JobLauncher 部分


    在 Web 容器中运行作业

    虽然大多数情况下批处理作业是从命令行启动的(无论是否已安排),但有几种方法可以从 Web 执行此操作。查看 Spring Batch 文档的 Running Jobs from within a Web Container 部分。

    这个想法很简单。您只需在控制器中调用 jobLauncher.run

    @Controller
    public class JobLauncherController {
    
        @Autowired
        JobLauncher jobLauncher;
    
        @Autowired
        Job job;
    
        @RequestMapping("/jobLauncher.html")
        public void handle() throws Exception{
            jobLauncher.run(job, new JobParameters());
        }
    }
    

    这是 Spring MVC(不是 Struts),但您可以看到它非常简单,适用于任何控制器/动作类:

    • jobLauncherjob 被注入 => setJobLauncher(...) / setJob(...)
    • jobLauncherjobLauncher.html 页面运行作业(注意:对run 的调用不会阻塞)

    Spring 批处理管理

    另一种完全不用担心 Spring MVC 和 Struts 来启动 Spring Batch 作业的方法是使用 Spring Batch Admin,它可以解决这个确切的问题等等(监控/停止/等等)

    【讨论】:

    • 不要忘记将“文件名”添加到 JobParameters 以使作业实例唯一。
    【解决方案2】:

    Struts 动作类是普通类,您可以在其中编写任何您想编写的代码。 S2 将默认调用您的操作类中的执行方法,直到您在配置文件中指定任何其他方法名称。 您只需要执行以下步骤

    1. 使用执行方法创建一个动作类。
    2. 使用具有批处理逻辑的方法创建服务类。
    3. 从您的操作类调用服务类

    为了从你的jsp发送文件名的值,你只需要创建一个输入字段,比如

    <s:textfield name="fileName" id="fileName"/>
    

    在您的操作类中创建一个名为fileName 的属性及其getter 和setter。您只需将文件名传递给您的批处理服务类方法即可。总之,您应该有一个类似的流程

    public class BatchProcessingAction extends ActionSupport{
    
        private string fileName;
        private ServiceClass serviceClass;
    
        getter ans setter for above defined properties
    
        public string execute() throw Exeption{
                serviceclass=new ServiceClass();  // can use Di or factory for this
                serviceClass.executeBatchProcessing(fileName);
                return SUCCESS;
        }
    
    }
    

    【讨论】:

    • 这并不能真正为该用户解释春季批处理方面的问题(答案 #1 可以),但这确实回答了他的问题的第二部分。
    • @TreverShick:我同意你的看法。我的回答更多的是关于 s2 部分 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2012-05-11
    • 2017-06-12
    • 1970-01-01
    • 2018-09-27
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多