Jakarta ee 使用QuartzInitializerServlet的石英调度器

Jakarta ee 使用QuartzInitializerServlet的石英调度器,jakarta-ee,servlets,quartz-scheduler,Jakarta Ee,Servlets,Quartz Scheduler,我遇到了quartz 2.x的所有示例,但没有一个明确的示例说明如何使用quartz初始化器Servlet初始化quartz调度器 每个人都声明一个Servlet,并在属性文件中写入一些内容。 但是没有人知道如何使用这个石英初始化器Servlet 如何配置我的调度程序以及何时调用调度程序的start方法,我问这个问题是因为我在一些博客中读到,即使我们没有显式调用start方法,servlet也会负责调用它!! 这是真的吗? 有谁能举例说明清楚,而不是复制粘贴谷歌的quartz.propertie

我遇到了quartz 2.x的所有示例,但没有一个明确的示例说明如何使用quartz初始化器Servlet初始化quartz调度器

每个人都声明一个Servlet,并在属性文件中写入一些内容。 但是没有人知道如何使用这个石英初始化器Servlet

如何配置我的调度程序以及何时调用调度程序的start方法,我问这个问题是因为我在一些博客中读到,即使我们没有显式调用start方法,servlet也会负责调用它!! 这是真的吗? 有谁能举例说明清楚,而不是复制粘贴谷歌的quartz.properties

因为这个话题有那么多未回答的问题


抱歉,如果我拼写错误。

hi quartz是一个很棒的库,但是关于如何在web项目上实现的示例很少。大多数示例都在spring上,但它们太复杂了。因此,经过多次尝试和错误,我终于能够在我的web应用程序中实现quartz调度程序。我尝试了quartz RamJobStore、XmlJob(在xml文件中存储作业和触发器)和持久作业(在mysql数据库中存储作业和触发器)石英最好的地方是对于这三种不同的方法,我不需要做任何额外的事情,我的意思是,对于所有这三种方法,作业和触发器创建逻辑保持不变,但是我们只需要配置属性文件就可以了

因此,我在java web应用程序中实现了quartz。我使用了net beans ide。下面是开始使用的代码。在这个示例中,我使用jdbcjobstore,这意味着我正在创建作业和触发器,并将它们存储在MySQL中,这样即使我的系统重新启动作业和触发器,它们也可以在保存在持久存储(MySQL)中时使用

1> 首先,我在NetBeans中创建了简单的JavaWeb项目

2> 从“quartz-2.2.1”包中添加lib文件夹中的所有jar,我从NetBeans项目和MySQL连接器jar的网站上下载了这个包

3> 配置log4j:为此,创建log4j.properties文件并添加以下行:

log4j.rootLogger=INFO, stdout
log4j.logger.org.quartz=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
**将此log4j.properties文件放入:

NetBeansProjects
    ->QurtzWebApp
        ->src
            ->java
                ->MySomePackage
                    ->HelloWorldJob.java
                log4j.properties
                quartz.properties
4> 通过右键单击NetBeans项目窗口中项目层次结构树中的
源程序包
,创建HelloWorldJob类

我的HelloWorldJob类包含以下代码:

package MySomePackage;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloWorldJob implements Job {
@Override
public void execute(JobExecutionContext context)throws JobExecutionException {   
        try
        {
            String content = "Quartz 2 example @ ["+new Date()+"]";
            File file = new File("C:\\DemoMsg.txt");

            if (!file.exists()) {
               file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile(),true);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(content);
            bw.close();
        }
        catch(Exception ex)
        {
            System.out.println("ex = "+ex.getMessage());
        }
    }
}
上面的代码只需在c驱动器中创建DemoMsg文本文件(如果尚未创建),并以定义的触发间隔在内容变量中写入消息define。例如,如果我创建了触发器以在每5分钟后执行一次,则您应该在文本文件中每5分钟间隔后看到此消息。我特意添加了日期值,以便您可以验证文件是否正确在这种情况下,每5分钟根据触发计划写入一次

5> 在第3步指定的位置创建
quartz.properties
文件,并在其中写入以下代码:

org.quartz.scheduler.instanceName = MY_SCHEDULER
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 4
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = MyDataStore
org.quartz.jobStore.tablePrefix = qrtz_
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.isClustered = false

org.quartz.dataSource.MailDataStore.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.MailDataStore.URL = jdbc:mysql://localhost:3306/quartz
org.quartz.dataSource.MailDataStore.user = yourdbusername
org.quartz.dataSource.MailDataStore.password = yourdbpassword
org.quartz.dataSource.MailDataStore.maxConnections = 20
在mysql中创建quartz数据库并创建quartz表。创建表的代码位于quartz-2.2.1\docs\dbTables\tables\u mysql.sql目录。只需导入此sql文件

5> 创建web.xml文件并添加以下条目:

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

org.quartz.ee.servlet.QuartzInitializerListener
6> 然后创建一个简单的jsp页面,其中包含一些表和表单,这些表和表单只接受来自用户的JobidJobName cro表达式并将其发布到另一个页面

7> 发布表单详细信息的jsp文件的代码如下:

    type=request.getParameter("type");

    if(type.equals("createSchedule"))
    {
        String jobName="",jobDesc="",jobData="",cronVal="";

        jobName=request.getParameter("txtJobName");
        jobDesc=request.getParameter("txtJobDesc");
        jobData=request.getParameter("txtJobData");
        cronVal=request.getParameter("txtCronExrp");

        SchedulerFactory sf = new StdSchedulerFactory();
        Scheduler sched = sf.getScheduler();
        System.out.println("------- Initialization Complete --------");

        System.out.println("------- Intitalizing Jobs ----------------");

        JobKey jobKey = new JobKey(""+jobName, "JobGroupName");
        JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity(jobKey).build();
        jobDetail.getJobDataMap().put("jobData",""+jobData);
        jobDetail.getJobDataMap().put("jobDesc",""+jobDesc);

        System.out.println("------- Intitalizing Triggers ----------------");
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(""+jobName+"_"+"Trigger", "TriggerGroup").withSchedule(CronScheduleBuilder.cronSchedule(""+cronVal)).build();


        System.out.println("------- Starting Scheduler ----------------");

        JobKey jk=new JobKey(""+jobName);
        TriggerKey tk=new TriggerKey (""+jobName+"_"+"Trigger");
        JobDetail Searchjob = sched.getJobDetail(jk);
        System.out.println("Job found = " + Searchjob);

         //Check if job already exist
        if (Searchjob == null) // job not exist
        {
            Date ft = sched.scheduleJob(jobDetail, trigger);
            System.out.println(sched.getSchedulerName());
            System.out.println(jobDetail.getKey() + " has been scheduled to run at: " + ft+ " and repeat based on expression: " + trigger.getCronExpression() );

        } 
        else //job exist
        {
            sched.rescheduleJob(tk, trigger);
        }

        sched.start();

        %>Schedule Created Successfully !<%
    }
type=request.getParameter(“type”);
if(type.equals(“createSchedule”))
{
字符串jobName=“”、jobDesc=“”、jobData=“”、cronVal=“”;
jobName=request.getParameter(“txtJobName”);
jobDesc=request.getParameter(“txtJobDesc”);
jobData=request.getParameter(“txtJobData”);
cronVal=request.getParameter(“txtCronExrp”);
SchedulerFactory sf=新StdSchedulerFactory();
调度程序sched=sf.getScheduler();
System.out.println(“----初始化完成----”;
System.out.println(“----初始化作业-----------------”;
JobKey JobKey=新的JobKey(“+jobName,”JobGroupName”);
JobDetail JobDetail=JobBuilder.newJob(HelloWorldJob.class).withIdentity(jobKey.build();
jobDetail.getJobDataMap().put(“jobData”和“+jobData”);
jobDetail.getJobDataMap().put(“jobDesc”,即“+jobDesc”);
System.out.println(“----初始化触发器------------”;
CronTrigger trigger=TriggerBuilder.newTrigger()。带标识(“+jobName+”“+”trigger”,“TriggerGroup”)。带调度(CronScheduleBuilder.cronSchedule(“+cronVal)).build();
System.out.println(“----启动调度器-----------------”;
JobKey jk=新的JobKey(“+jobName”);
TriggerKey tk=新的TriggerKey(“+jobName+”“+”触发器”);
JobDetail Searchjob=sched.getJobDetail(jk);
System.out.println(“找到的作业=”+搜索作业);
//检查作业是否已存在
if(Searchjob==null)//作业不存在
{
日期ft=调度作业(作业详细信息,触发器);
System.out.println(sched.getSchedulerName());
System.out.println(jobDetail.getKey()+”已计划在“+ft+”处运行,并根据表达式“+trigger.getCronExpression()”)重复;
} 
否则//job存在
{
计划重新安排作业(tk,触发器);
}
sched.start();
%>已成功创建计划!我传递参数以检查是否要创建、编辑或删除作业。
对于编辑和删除作业,您需要在创建作业时定义的作业id


我知道答案太长,但我希望它能在您的场景中帮助您。

QuartzInitializerServlet将为您启动调度程序,并在ServletContext中放置一个StdSchedulerFactory

要检索已启动的计划程序,请执行以下操作:

ServletContext ctx = request.getServletContext();
StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute( QuartzInitializerServlet.QUARTZ_FACTORY_KEY);  
Scheduler scheduler = factory.getScheduler();
其中“request”是当前的HTTPServletRequest

可以配置调度程序
<servlet>
      <servlet-name>QuartzInitializer</servlet-name>
      <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
        <init-param>
         <param-name>config-file</param-name>
         <param-value>quartz.properties</param-value>
      </init-param>
      <init-param>
        <param-name>shutdown-on-unload</param-name>
        <param-value>true</param-value>
      </init-param>
      <load-on-startup>2</load-on-startup>
</servlet>