Quartz Job Scheduling Framework[翻译]第十四章. 工作流中使用 Quartz (第四部分)

四. 创建一个工作流 Job


最后,我们需要介绍启动工作流的 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) 进行许可。