hi quartz - это потрясающая библиотека, но есть очень мало примеров того, как реализовать на веб-проекте. Большинство примеров относятся к весне, но они слишком сложны. Поэтому после долгих проб и ошибок я наконец смог реализовать кварцевый планировщик в мое веб-приложение. Я пробовал Quartz RamJobStore, XmlJob (сохранение заданий и триггеров в xml-файле) и Постоянное задание (сохранение задания и триггера в базе данных mysql). Самое лучшее, что касается кварца для этих трех разных подходов, я не должен делать ничего лишнего. Я имею в виду, что логика создания задания и триггера остается неизменной для всех этих трех подходов, однако нам просто нужно настроить наши файлы свойств, чтобы они работали.
Так что я реализовал кварц в веб-приложении Java. Я использую net-beans ide.Below - это код, который поможет вам начать. В этом примере я использую jdbcjobstore, что означает, что я создаю задание и запускаю и сохраняю их в MySQL, так что даже если моя система перезапустит задание и триггер будет доступна как они сохраняются в постоянном хранилище (MySQL).
1> Сначала я создал простой веб-проект java в net-beans.
2> Добавить все банки в папку lib из пакета "quartz-2.2.1", который я загрузил с веб-сайта там, где находится ваш проект net-beans и соединитель MySQL.
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> Создать HelloWorldJob класс, щелкнув правой кнопкой мыши по source packages
в дереве проектной иерархии в окне проекта net-beans.
Моего HelloWorldJob Conatains класс код ниже:
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());
}
}
}
Над кода просто создать DemoMsg текстовый файл в диске, если уже не созданы и написать сообщение определить в переменном контенте на определенном триггере interval.for например, если я создал триггер для выполнения через каждые 5 минут, вы должны увидеть это сообщение через каждые 5 минут в текстовом файле. Я специально добавил значение даты, чтобы вы могли проверить, записывается ли файл в соответствии с расписанием триггера в этом случае через каждые 5 минут.
5> Создать quartz.properties
файл в месте указать на 3 шага и писать ниже код в нем:
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 кварцевое и создать кварцевый tables.Code для создания таблицы можно найти в quartz-2.2.1\docs\dbTables\tables_mysql.sql
каталоге. Просто импортируйте этот файл sql.
5> создать файл web.xml и добавить follwing запись:
<listener>
<listener-class>
org.quartz.ee.servlet.QuartzInitializerListener
</listener-class>
</listener>
6> Затем создал простую страницу JSP с помощью таблиц и форм, которые только принимают JobId JobName 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 !<%
}
8> я передать параметр, чтобы проверить, следует ли я создавать, редактировать или удалять задания. для издания и удаления задания вам нужен идентификатор работы, который определяется при создании задания.
Я знаю, что ответ слишком длинный, но я надеюсь, что он поможет вам в вашем сценарии.