我有一个使用JSF 2的Web应用程序.在这个应用程序中,我使用的是一个从xml文件获取数据的图表库,当有人访问该站点时,应用程序会更新xml文件,因为jsf 2 Action.现在我想实现Quartz库的开源调度库,更新xml文件而不依赖于用户操作,但我不知道如何使用JSF 2从Quartz调用Action.
先谢谢你们.
这是我第一次使用Quartz.我正在尝试一个预先打印"Hello World"的示例程序.但是,当我尝试运行它时,我得到一个错误说
线程"main"中的异常java.lang.RuntimeException:无法编译的源代码 - org.quartz.JobDetail是抽象的; 无法在QuartzAppSimpleTrigger.main中实例化(QuartzAppSimpleTrigger.java:18)
当我在Netbeans中尝试它时,它要求我实现JobDetail的所有抽象方法.以下是我的代码示例.
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
public class HelloSchedule {
public HelloSchedule() throws Exception {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
sched.start();
JobDetail jd = new JobDetail("myjob", sched.DEFAULT_GROUP, HelloJob.class);
SimpleTrigger st = new SimpleTrigger("mytrigger", sched.DEFAULT_GROUP, new Date(),
null, SimpleTrigger.REPEAT_INDEFINITELY, 60L * 1000L);
sched.scheduleJob(jd, st);
}
public static void main(String args[]) {
try {
new HelloSchedule();
} catch (Exception e) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
HelloJob.java是 …
我想知道Quartz Scheduler和JMS之间有什么区别,在什么情况下更好地使用这些工具......
我创建了一个Akka的调度程序,每天发送邮件一段固定的时间(例如每天早上6点).那么如何调用演员呢?我的意思是我应该使用什么逻辑?谢谢.
根据Quartz 2的文档
RequestsRecovery - 如果一个作业"请求恢复",并且它正在调度程序的"硬关闭"期间执行(即它在崩溃中运行的进程,或者机器被关闭),那么它将被重新执行当调度程序再次启动时.在这种情况下,JobExecutionContext.isRecovering()方法将返回true.
Spring3支持Quartz 1.x和Quartz 2.x. 如果我们使用Quartz 1.x那么我们需要使用以下配置来创建JobDetailbean:
<bean id="ldapSynch" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.edfx.adb.scheduling.job.LDAPSynchronizer" />
<property name="requestsRecovery" value="true" />
</bean>
Run Code Online (Sandbox Code Playgroud)
内部org.springframework.scheduling.quartz.JobDetailBean扩展org.quartz.JobDetail并在Quartz 1.x中org.quartz.JobDetail有一个setter public void setRequestsRecovery(boolean shouldRecover).
但是如果我们使用Spring3的Quartz 2.x实现那么上述配置会改变为:
<bean id="ldapSynch" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.edfx.adb.scheduling.job.LDAPSynchronizer" />
<property name="requestsRecovery" value="true" />
</bean>
Run Code Online (Sandbox Code Playgroud)
并且在Quartz 2.x中没有这样的org.quartz.JobDetail类,而是它是一个interface并且最终org.springframework.scheduling.quartz.JobDetailFactoryBean不再采用参数<property name="requestsRecovery" value="true" />.
我们怎样才能将这个重要的内容传递parameter给Quartz的调度程序?
在我的项目中,我们是Quartz用户的新手,编写我们的第一个Quartz任务.我们的任务正在运行,但显然我们想要了解如何管理它们.我们在Spring中配置它们就像这样:
<bean name="enoteExpirationTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="gov.usdoj.afms.enote.job.DailyExpirationJob" />
<property name="jobDataAsMap">
<map>
<entry key="messageService" value-ref="enoteMessageService" />
<entry key="logicalDeleteAge" value="${expiryProcess.logical.age}" />
<entry key="physicalDeleteAge" value="${expiryProcess.physical.age}" />
</map>
</property>
</bean>
<bean id="cronEnoteExpirationTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="enoteExpirationTask" />
<property name="cronExpression" value="0 0 7 * * ?" />
</bean>
Run Code Online (Sandbox Code Playgroud)
问题1:我可以让Quartz重新读取这个配置,这样如果我在运行时改变它,它会改变它的时间表吗?这将是最简单的解决方案,但我们没有看到任何内容.我希望我们错过了一些东西.
问题2:如果没有,我理解应该有第三方工具来做到这一点,Teracotta就是其中之一.是否有任何开源或免费软件实用程序可以让您非常简单地更改计划?
问题3:如果没有,编写一个小Java实用程序会涉及到什么?写一个是值得的吗?或者Teracotta是否有足够的增值值,你会建议买它?如果是这样,我可以向管理层出售的功能有何不同?
我想安排一个使用Quartz的工作在一小时后运行30分钟.例如,我希望工作在00:30,1:30,2:30运行,依此类推.
你能帮助我得到正确的cron表达吗?
一个问题是,执行完作业后,石英从数据库qrtz_triggers表中删除了作业,但是在特定情况下需要重复执行失败的作业。
执行后是否有任何配置选项或将作业存储到另一个表的方式???
谢谢
我想在Burt的例子中创建使用JdbcStore的石英作业,如文档的聚类部分所述.
该示例显示了如何使用quartz.properties文件配置quartz.
现在,我希望我的jdbc存储与我的grails应用程序是同一个数据库,这样我就可以复制更少的设置了.
那么,假设我在我的数据库中手动创建了所需的表,是否可以使用在石英插件中使用Datasource.groovy中配置的默认dataSource?
我使用的是grails 2.4.4和quartz 1.0.2.
换句话说,我可以将我的设置添加到QuartzConfig.groovy而不是创建一个新的quartz.properties文件吗?至少我可以从单独的环境设置中受益.
这样的东西在QuartzConfig.groovy中是否有效?
quartz {
autoStartup = true
jdbcStore = true
waitForJobsToCompleteOnShutdown = true
exposeSchedulerInRepository = true
props {
scheduler.skipUpdateCheck = true
threadPool.class = 'org.quartz.simpl.SimpleThreadPool'
threadPool.threadCount = 50
threadPool.threadPriority = 9
jobStore.misfireThreshold = 60000
jobStore.class = 'impl.jdbcjobstore.JobStoreTX'
jobStore.driverDelegateClass = 'org.quartz.impl.jdbcjobstore.StdJDBCDelegate'
jobStore.useProperties = false
jobStore.tablePrefix = 'QRTZ_'
jobStore.isClustered = true
jobStore.clusterCheckinInterval = 5000
plugin.shutdownhook.class = 'org.quartz.plugins.management.ShutdownHookPlugin'
plugin.shutdownhook.cleanShutdown = true
jobStore.dataSource = 'myDS'
// [...]
}
Run Code Online (Sandbox Code Playgroud) 我有一个正在运行mysql数据库的Spring Boot 2应用程序,想要添加Quartz调度程序。组态:
spring.quartz.job-store-type=jdbc
spring.quartz.jdbc.initialize-schema=always
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
Run Code Online (Sandbox Code Playgroud)
但是在启动时,它不会创建数据库表,并且在访问QRTZ_ *表时会失败。我调试了我在ScriptUtilsSpring调用的类中发现的执行石英脚本的原因tables_mysql_innodv.sql。特意抑制了该异常:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以获取在'DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS附近使用正确的语法;如果存在第9行的DRTZ_SCHEDUL',则删除表
我看不到任何语法错误,当我直接在MySQL Workbench中执行相同的脚本时,它运行良好,即创建表等。
此处提供了已执行的启动脚本的源代码。在这一行遇到异常。有一个发现使我感到困惑:同一方法中的代码尝试拆分SQL语句,但仅提取2条语句-第一行#和其余脚本。也许这是实际的问题。
那么,我该如何解决呢?
版本信息: