Jakarta ee 使用QuartzInitializerServlet的石英调度器
我遇到了quartz 2.x的所有示例,但没有一个明确的示例说明如何使用quartz初始化器Servlet初始化quartz调度器 每个人都声明一个Servlet,并在属性文件中写入一些内容。 但是没有人知道如何使用这个石英初始化器Servlet 如何配置我的调度程序以及何时调用调度程序的start方法,我问这个问题是因为我在一些博客中读到,即使我们没有显式调用start方法,servlet也会负责调用它!! 这是真的吗? 有谁能举例说明清楚,而不是复制粘贴谷歌的quartz.properties 因为这个话题有那么多未回答的问题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
抱歉,如果我拼写错误。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>