Quartz Job Scheduling Framework[翻译]第十四章. 工作流中使用 Quartz (第四部分)
四. 创建一个工作流 Job
最后,我们需要介绍启动工作流的 Quartz Job 。当 Scheduler 调用了它,Quartz Job 就查找工作流的名字,并启动、运行相应的工作流。如果没有在 JobDataMap 中配置工作流的名字,Job 就会直接退出。
代码 14.13 显示了 WorkflowJob.
代码 14.13. Quartz WorkflowJob 设计为调用一个 OSWorkflowJob
这个工作流实际是在代码 14.13 的 executeWorkflow() 方法中启动的。一个新的工作流实例被创建了。它通过从 JobDataMap 中读取到的工作流名字来初始化的。工作流实例的 initialize() 和 doAction() 方法用了一个 java.util.Map 作为第三个参数。Map 中的值会通过 transientVars 参数传递到工作流的每一个函数中。如果你回头看看代码 14.11,你会看到 SCAN_DIR 是如何从 transientVars 抽取出来的。这个数据最初是在 JobDataMap 的。
本例中,我们从 Quartz Job 中获得 JobDataMap 并传值到工作流中。这是集成这两个框架的其中一种方式,简单也很直截。
最后,代码 14.14 显示了 Scheduler 的代码,它用于部署 WorkflowJob 并把工作流名称和 SCAN_DIR 存入到 JobDataMap 中。
代码 14.14. WorkflowJob 以正常方式部署,但必须存工作流名称到 JobDataMap 中
你看到代码 14.14 时不应感到惊讶。唯一要注意的事情是我们存储了工作流名称到 JobDataMap 中。和本章前面的 Job 串联例子一样,假如你想使用 JobInitializationPlugin,你可以简单的在文件中指定工作流的名称。
五. 小结
我们从本章中学到了什么?首先,Job 串联可由 Quartz 框架实现。你可用所介绍的两种方法,只是不借助于监听器实现的方式或许会让你有些头疼。我希望你带走的另一课是 Job 串联并非工作流。它也许看起来像工作流,你可能还对此存有疑虑,只要回到前面从头至尾构建一个自己的例子就能清楚了。一定要读一读 OSWorkflow 的文档并找出我们未提及的特性。你就能明白工作流比 Job 串联丰富多了。
最后,你应该了解到了同 Quartz 一同使用 OSWorkflow 实际是颇为简单的。所有要用到的就是几个二进制包,几个配置文件和一些工作流函数。把它们同工作流定义文件打包到一块,你就大功告成了。很快,你就将构建出一个可重用的函数库和一连串工作流来运行你的业务。不久,你就会有一个为之自豪的精致小巧的应用程序。 永久链接 https://yanbin.blog/quartz-job-scheduling-framework-14-4/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
最后,我们需要介绍启动工作流的 Quartz Job 。当 Scheduler 调用了它,Quartz Job 就查找工作流的名字,并启动、运行相应的工作流。如果没有在 JobDataMap 中配置工作流的名字,Job 就会直接退出。
代码 14.13 显示了 WorkflowJob.
代码 14.13. Quartz WorkflowJob 设计为调用一个 OSWorkflowJob
1public class WorkflowJob implements Job {
2 static Log logger = LogFactory.getLog(WorkflowJob.class);
3
4 /**
5 * Called by the scheduler to execute a workflow
6 */
7 public void execute(JobExecutionContext context)
8 throws JobExecutionException {
9 JobDataMap jobDataMap = context.getJobDataMap();
10
11 String wfName = jobDataMap.getString("WORKFLOW_NAME");
12 if (wfName != null && wfName.length() > 0) {
13 try {
14 executeWorkflow(wfName, jobDataMap);
15 } catch (Exception ex) {
16 logger.error(ex);
17 throw new
18 JobExecutionException(ex.getMessage());
19 }
20 } else {
21 logger.error("No Workflow name in JobDataMap");
22 }
23 }
24
25 protected void executeWorkflow(String workflowName,
26 JobDataMap jobDataMap) throws WorkflowException {
27
28 // Create the inputs for the workflow from JobDataMap
29 Map workflowInputs = new HashMap();
30 Iterator iter = jobDataMap.keySet().iterator();
31 while (iter.hasNext()) {
32 String key = (String) iter.next();
33 Object obj = jobDataMap.get(key);
34 workflowInputs.put(key, obj);
35 }
36 // Create and execute the workflow
37 Workflow workflow = new BasicWorkflow("someuser");
38 workflow.setConfiguration(new DefaultConfiguration());
39
40 long workflowId = workflow.initialize(workflowName, 1, workflowInputs);
41
42 workflow.doAction(workflowId, 1, workflowInputs);
43 }
44}这个工作流实际是在代码 14.13 的 executeWorkflow() 方法中启动的。一个新的工作流实例被创建了。它通过从 JobDataMap 中读取到的工作流名字来初始化的。工作流实例的 initialize() 和 doAction() 方法用了一个 java.util.Map 作为第三个参数。Map 中的值会通过 transientVars 参数传递到工作流的每一个函数中。如果你回头看看代码 14.11,你会看到 SCAN_DIR 是如何从 transientVars 抽取出来的。这个数据最初是在 JobDataMap 的。
本例中,我们从 Quartz Job 中获得 JobDataMap 并传值到工作流中。这是集成这两个框架的其中一种方式,简单也很直截。
最后,代码 14.14 显示了 Scheduler 的代码,它用于部署 WorkflowJob 并把工作流名称和 SCAN_DIR 存入到 JobDataMap 中。
代码 14.14. WorkflowJob 以正常方式部署,但必须存工作流名称到 JobDataMap 中
1public class WorkflowScheduler {
2 static Log logger = LogFactory.getLog(WorkflowScheduler.class);
3
4 public static void main(String[] args) {
5
6 try {
7 // Create and start the Scheduler
8 Scheduler scheduler =
9 StdSchedulerFactory.getDefaultScheduler();
10 scheduler.start();
11
12 JobDetail jobDetail =
13 new JobDetail("WorkflowJob", null,
14 WorkflowJob.class);
15 // Store the scan directory and workflow name
16 JobDataMap dataMap = jobDetail.getJobDataMap();
17 dataMap.put("SCAN_DIR", "c:\\quartz-book\\input");
18 dataMap.put("WORKFLOW_NAME", "data-import");
19
20 // Create a simple trigger
21 Trigger trigger =
22 TriggerUtils.makeSecondlyTrigger(30000, -1);
23 trigger.setName("WorkflowTrigger");
24 trigger.setStartTime(new Date());
25
26 // schedule the job
27 scheduler.scheduleJob(jobDetail, trigger);
28
29 } catch (SchedulerException ex) {
30 logger.error(ex);
31 }
32 }
33}你看到代码 14.14 时不应感到惊讶。唯一要注意的事情是我们存储了工作流名称到 JobDataMap 中。和本章前面的 Job 串联例子一样,假如你想使用 JobInitializationPlugin,你可以简单的在文件中指定工作流的名称。
五. 小结
我们从本章中学到了什么?首先,Job 串联可由 Quartz 框架实现。你可用所介绍的两种方法,只是不借助于监听器实现的方式或许会让你有些头疼。我希望你带走的另一课是 Job 串联并非工作流。它也许看起来像工作流,你可能还对此存有疑虑,只要回到前面从头至尾构建一个自己的例子就能清楚了。一定要读一读 OSWorkflow 的文档并找出我们未提及的特性。你就能明白工作流比 Job 串联丰富多了。
最后,你应该了解到了同 Quartz 一同使用 OSWorkflow 实际是颇为简单的。所有要用到的就是几个二进制包,几个配置文件和一些工作流函数。把它们同工作流定义文件打包到一块,你就大功告成了。很快,你就将构建出一个可重用的函数库和一连串工作流来运行你的业务。不久,你就会有一个为之自豪的精致小巧的应用程序。 永久链接 https://yanbin.blog/quartz-job-scheduling-framework-14-4/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明]
本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。