JSF 2 + Quartz调度库

时间:2011-10-27 04:26:04

标签: jsf jsf-2 quartz-scheduler

我有一个使用JSF 2的Web应用程序。在这个应用程序中,我使用的是一个从xml文件获取数据的图表库,当有人访问该站点时,应用程序会更新xml文件,因为jsf 2 Action。现在我想实现Quartz库的开源调度库,更新xml文件而不依赖于用户操作,但我不知道如何使用JSF 2从Quartz调用Action。

先谢谢你们。

2 个答案:

答案 0 :(得分:7)

一般来说,您应该实现计划的逻辑,定义它将运行的时间,并在应用程序服务器启动时初始化计划的作业。

实施预定逻辑

您的预定班级应实施org.quartz.Job界面并覆盖其execute(),其中包含您预定作业的逻辑。在您的情况下,它是更新XML文件的方法。您应该使此方法对JSF没有任何依赖性,以便可以在JSF外部调用它。

public class MyScheduledJob implements Job {

   public void execute(JobExecutionContext context) throws JobExecutionException {
          updateXML();
   }
}

初始化并启动Quartz

Quartz提供了一个名为QuartzInitializerListenerServletContextListener,允许您在应用程序服务器启动时初始化并启动Quartz。

将此听众添加到web.xml

<listener>
     <listener-class> org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
</listener>

默认情况下,它会在类路径中查找名为quartz.properties的文件来初始化Quartz。有关quartz.properties

中可用的可配置选项的详细信息,请参阅this

定义哪个作业将在哪个时间运行

您可以在XML文件中定义它(可以找到其架构定义here)并在quartz.properties中配置XMLSchedulingDataProcessorPlugin以在初始化Quartz时加载此XML。

例如,在quartz.properties

  

org.quartz.plugin.jobInitializer.class   = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin org.quartz.plugin.jobInitializer.fileNames = quartz-config.xml   org.quartz.plugin.jobInitializer.failOnFileNotFound = true

然后在 quartz-config.xml

<?xml version="1.0" encoding="UTF-8"?>

    <job-scheduling-data
        xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
        version="1.8">

        <schedule>
            <job>
                <name>MyScheduledJob</name>
                <group>MyScheduledGroup</group>
                <description>Job to update XML </description>
                <job-class>com.xxxx.xxxx.xxxx.MyScheduledJob </job-class>
            </job>

            <trigger>
                    <cron>
                            <name>midNightTrigger</name>
                            <job-name>MyScheduledJob</job-name>
                            <job-group>MyScheduledGroup</job-group>
                            <!-- It will run every night at 3:30 am -->
                            <cron-expression>0 30 3 * * ?</cron-expression>  
                    </cron>
              </trigger>
        </schedule>
    </job-scheduling-data>

以上所有内容均为Quartz'最新版本2.1。您可以查看Quartz的sample codestutorials了解更多信息。

答案 1 :(得分:0)

如果您确实想要从预定作业调用JSF操作,则作业的execute()方法将需要包含对JSF操作发出HTTP请求的代码。如果java的URLConnection类不能轻易满足您的需求,您可能希望使用Apache HttpClient或HTTP Unit等代码库。