当前位置: 首页 > 知识库问答 >
问题:

在simple webapp中使用quartz schedular调度作业

漆雕博
2023-03-14
  1. 我是否需要quartz.properties
  2. 我需要quartz.xml吗?我不能使用类/servlet做同样的事情吗?
  3. 如何初始化计划程序以及谁将触发作业?

我有一个执行作业独立程序,我可以在任何servlet的init中编写,并在容器 1 启动时启动servlet。这样做对吗?

共有1个答案

麻昌翰
2023-03-14
  1. 如果quartz找不到quartz.properties文件,则使用默认值。如果要指定默认值以外的其他值,显然需要它。
  2. 您不需要quartz.xml,您可以通过代码配置作业(下面的解决方案描述了这两种方式)
  3. 以下是每10分钟重复一次作业的代码示例:
public class HelloJob implements Job {

    @Override
    public void execute(JobExecutionContext context)
            throws JobExecutionException {
        //put your code here
    }

}

由于您不想使用xml,而是想要java代码,所以可以从ServletContext获取一个StdSchedulerFactory实例来配置调度器,并且为了在初始化时调用该代码,必须将其放入侦听器中:

public class HelloQuartzListener implements ServletContextListener {

    private Scheduler scheduler;

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {

    }

    @Override
    public void contextInitialized(ServletContextEvent ctx) {
        // define the job and tie it to our HelloJob class
        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "group1").build();

        // Trigger the job to run now, and then every 10 minutes
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger", "group1")
                .startNow()
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInMinutes(10).repeatForever())
                .build();
        // Tell quartz to schedule the job using our trigger

        try {
            scheduler = ((StdSchedulerFactory) ctx.getServletContext()
                    .getAttribute(
                            QuartzInitializerListener.QUARTZ_FACTORY_KEY))
                    .getScheduler();
            scheduler.scheduleJob(job, trigger);
        } catch (SchedulerException e) {

        }
    }
}

为了从web应用程序初始化quartz,您需要通过向web.xml添加以下内容来配置QuartzInitializerListener。注意,最后我们还添加了之前创建的通过java代码配置作业的监听器。重要的是,它在QuartzInitializerListener之后,因为需要首先调用QuartzInitializerListener,以便将StdSchedulerFactory放在上下文中,以便HelloJobListener获得它:

<context-param>
    <param-name>quartz:shutdown-on-unload</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>quartz:wait-on-shutdown</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>quartz:start-on-load</param-name>
    <param-value>true</param-value>
</context-param>

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

<listener>
    <listener-class>yourpackage.HelloQuartzListener</listener-class>
</listener>

******如果您确实想要设置自己的属性值,您可以添加属性文件并包含其路径,方法是将其添加到web.xml中:

 <context-param>
        <param-name>quartz:config-file</param-name>
        <param-value>/WEB-INF/quartz.properties</param-value>
    </context-param>

******.如果您决定更喜欢使用xml,那么您可以通过添加以下内容在属性文件中指定:

 org.quartz.plugin.jobInitializer.class =org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin 
org.quartz.plugin.jobInitializer.fileNames = quartz.xml 

其中“quartz.xml”将包含作业详细信息(当然,在这种情况下,请删除HelloJobListener配置和类):

<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>HelloJob</name>
            <group>group1</group>
            <description>hello</description>
            <job-class>yourpackage.HelloJob</job-class>
        </job>

        <trigger>
            <cron>
                <name>myTrigger</name>
                <job-name>HelloJob</job-name>
                <job-group>group1</job-group>
                <!-- It will run every 10 minutes -->
                <cron-expression>0 0/10 * * * ?</cron-expression>
            </cron>
        </trigger>
    </schedule>
</job-scheduling-data>
 类似资料:
  • 我正在寻找最好的解决方案,以创建一个java web应用程序,以生成Excel/PDF格式的报告。类似于Google Adwords的东西,用户可以创建日程报告,并在以后生成报告时下载。 我正在考虑开发一个java应用程序,在其中用户记录,选择一个预先定义的报告,并提供输入参数(如报告日期等),这个请求将被排队或保存为Quarts作业(首选持久队列)。一个作业将监视队列/作业并执行该作业,生成报告

  • 我是hadoop新手,我写了一些作业并将它们导出为jar文件。我可以使用hadoop jar命令运行它们,我想每一小时运行一次这些作业。我该怎么做?提前谢谢。

  • 我有一份詹金斯的工作,计划在特定的时间进行。我想以编程方式修改该计时。 我试图通过安装Schedule build插件并使用。但这将使作业处于保持java线程的静默期。我希望在不将其置于静默期的情况下修改计划条目。

  • 我们有一个使用Spring Framework在Tomcat中运行的Web应用程序。我们需要为循环操作添加一些计划作业。为此,我们遇到了Quartz Scheduler,并遵循了使用Quartz with Spring配置作业的教程,并按预期计划并运行了作业。 所以我们有一些任务是在应用程序启动时安排的。现在我们希望用户手动运行作业并更改作业的触发器,但是我们需要将这些更改持久化到数据库中。因此,

  • 我希望使用Quartz调度器,以便应用程序的服务器部分使用调度器创建一个作业并将其存储在JDBCStore中,而UI部分(前端)使用调度器的另一个实例(指向相同的数据库模式)为该作业添加触发器。我以为UI知道作业和组的名称就足够了,因为添加触发器类似于: 不幸的是,这会为job类抛出异常。如有任何帮助,我们将不胜感激。谢谢你。

  • 如果这个问题太幼稚,我很抱歉,我希望作业被安排成一个一个地执行,而不是并行地执行,它只执行一次。 在文档中,@disallowConcurrentExecution是 null PS:我不知道会安排哪些工作。因此,如果作业已经在运行,我需要一些方法来动态链接作业。