在我的Spring应用程序中,我使用的SchedulerFactoryBean是与Quartz集成.我们将要有群集的Tomcat实例,因此我希望拥有一个集群的Quartz环境,这样相同的作业就不会在不同的Web服务器上同时运行.
为此,我的app-context.xml内容如下:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
<ref bean="simpleTrigger" />
</list>
</property>
<property name="dataSource" ref="dataSource"/>
<property name="overwriteExistingJobs" value="true"/>
<!-- found in applicationContext-data.xml -->
<property name="applicationContextSchedulerContextKey" value="applicationContext"/>
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">SomeBatchScheduler</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
<!--<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>-->
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
<prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
<prop key="org.quartz.jobStore.isClustered">true</prop>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">25</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
</props>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
一切都运行良好,除了当我尝试删除或更改触发器,然后重新启动我的应用程序时,旧的触发器仍然保留在数据库中,仍然运行.我不希望这样,我只是希望在app停止(或重新启动)时删除它们.我将overwriteExistingJobs属性的值设置为true,因为我认为这就是它所做的.
有任何想法吗?我只想使用数据库进行聚类,而不是任何类型的持久性.
我想知道如何使用guice在我的工作中使用注射.由于我不能在默认构造函数上使用@Inject,我可以直接在属性上使用它(如下所示)(我总是得到一个带有PersonDAO的NullPointerException)?我知道DAO在这里无关,但它只是用于测试.
public class SimpleQuartzJob implements Job {
@Inject PersonDao Person;
private static Logger logger = Logger.getLogger(SimpleQuartzJob.class.getName());
public SimpleQuartzJob() {
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
if (logger.isDebugEnabled()) logger.debug("In SimpleQuartzJob - executing its JOB at "
+ new Date() + " by " + context.getTrigger().getName());
// ... LOGIC ...
}
}
Run Code Online (Sandbox Code Playgroud)
在我的模块中,我有以下声明:
bind(PersonDao.class).to(HibernatePersonDaoImpl.class);
Run Code Online (Sandbox Code Playgroud)
实际上我在这里使用PersonDao'因为我知道它在另一个带注入的类中工作(但注入是在那里的构造函数级别完成的).
有人可以给我一个建议吗?
这里有关于quartz config的更多信息:
web.xml中:
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<display-name>Quartz Initializer Servlet</display-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<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>
<init-param>
<param-name>start-scheduler-on-load</param-name>
<param-value>true</param-value>
</init-param>
</servlet> …Run Code Online (Sandbox Code Playgroud) 在不删除作业或触发记录且不擦除cron表达式的情况下,在JDBCJobStore中禁用作业的最佳方法是什么?
我正在尝试运行roseindi.net上提供的用于石英调度的示例helloworld程序 http://www.roseindia.net/quartz/quartz-scheduler-tutorial.shtml
我在两个类中给出了类似于我的java projecy中的类似设置,石英版本1.6 - 项目库中的all.jar.当我尝试运行应用程序时,我得到以下异常
Exception in thread "main" java.lang.NoClassDefFoundError: javax/transaction/UserTransaction
at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1104)
at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1355)
at oiaoerpdataconnector.HelloSchedule.HelloScheduleRun(HelloSchedule.java:25)
at oiaoerpdataconnector.HelloSchedule.main(HelloSchedule.java:37)
Caused by: java.lang.ClassNotFoundException: javax.transaction.UserTransaction
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 4 more
Java Result: 1
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
谢谢,
Priyank
我有一个应用程序,我想使用Quartz Scheduler对象.我已经阅读了关于这个的Spring文档,他们建议使用SchedulerFactoryBean这样的:
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="autoStartup">
<value>true</value>
</property>
<property name="configLocation" value="classpath:quartz.properties" />
</bean>
Run Code Online (Sandbox Code Playgroud)
配置如下所示:
org.quartz.scheduler.skipUpdateCheck = true
org.quartz.scheduler.instanceName = MyQuartzScheduler
org.quartz.scheduler.jobFactory.class = org.quartz.simpl.SimpleJobFactory
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
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
Run Code Online (Sandbox Code Playgroud)
现在,如果我想注入schedulerFactoryBean我的一个对象,我得到一个异常说明:
Could not convert constructor argument value of type [org.quartz.impl.StdScheduler] to required type [org.springframework.scheduling.quartz.SchedulerFactoryBean]:
为什么我得到一个StdScheduler而不是一个schedulerFactoryBean?我错过了配置步骤吗?
我有一个大约5台服务器的车队.我想在每台机器上运行相同的Spring/Tomcat应用程序.
我还需要每十分钟执行一次特定任务.它应该只在其中一台机器上运行.我需要某种选举协议或其他类似的解决方案.
Spring或Quartz是否有任何内置的分布式cron解决方案,或者我是否需要自己实现?
我得到的调度程序如下:
StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBeanName);
schedulerBean.start();
Run Code Online (Sandbox Code Playgroud)
然后
schedulerBean.shutdown();
Run Code Online (Sandbox Code Playgroud)
执行几个其他代码后,我再次调用schedulerBean.start().
现在代码抛出错误 - "org.quartz.SchedulerException:调用shutdown()后调度程序无法重启"
你能告诉我如何解决这个问题吗?
提前谢谢,凯西尔
在一个应用程序中,由于我将它从经典的Spring webapp(部署在系统Tomcat中)转换为Spring Boot(V1.2.1)应用程序,我面临的问题是基于Quartz的预定作业不再起作用.
我安排这些Quartz工作如下:
// My own Schedule object which holds data about what to schedule when
Schedule schedule = scheduleService.get(id of the schedule);
String scheduleId = schedule.getId();
JobKey jobKey = new JobKey(scheduleId);
TriggerKey triggerKey = new TriggerKey(scheduleId);
JobDataMap jobData = new JobDataMap();
jobData.put("scheduleId", scheduleId);
JobBuilder jobBuilder = JobBuilder.newJob(ScheduledActionRunner.class)
.withIdentity(jobKey)
.withDescription(schedule.getName())
.usingJobData(jobData);
JobDetail job = jobBuilder.build();
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger()
.forJob(jobKey)
.withIdentity(triggerKey)
.withDescription(schedule.getName());
triggerBuilder = triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(schedule.toCronExpression()));
Trigger trigger = triggerBuilder.build();
org.quartz.Scheduler scheduler = schedulerFactoryBean.getScheduler();
scheduler.scheduleJob(job, trigger);
Run Code Online (Sandbox Code Playgroud)
ScheduledActionRunner:
@Component
public …Run Code Online (Sandbox Code Playgroud) 我在一个jboss实例上部署了两只耳朵.我在mbean中使用了quartz.两只耳朵都在使用StatefulJobs.不幸的是,一个是使用库antlr-runtime-3.0,而第二个是antlr-runtime-3.2.当JBoss调用该作业时,它需要错误的库.我不知道如何强迫他从耳边使用图书馆.我的石英版升级到1.8.6.JBoss是4.2.2 GA
我的第一个耳结构:
META-INF
ANTLR运行时,3.0.jar
我的第二个耳结构:
的Application.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>ear</display-name>
<module>
<web>
<web-uri>app.war</web-uri>
<context-root>/</context-root>
</web>
</module>
<module>
<ejb>app.jar</ejb>
</module>
</application>
Run Code Online (Sandbox Code Playgroud)
的jboss-app.xml中
<?xml version='1.0' encoding='UTF-8' ?>
<jboss-app>
<loader-repository>
pck.class:app.war=unique-app.war
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
</loader-repository>
</jboss-app>
Run Code Online (Sandbox Code Playgroud)
堆:
org.quartz.SchedulerException: Problem instantiating class 'package.quartz.WsclFailureJob' - [See nested exception: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSha
redState;)V]
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:147)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:364)
Caused by: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSharedState;)V
at package.cond.antlr.CondLexer.<init>(CondLexer.java:55)
at package.cond.antlr.CondLexer.<init>(CondLexer.java:52)
at package.cond.ExpressionFactory.getValue(ExpressionFactory.java:58)
at packagee.Configuration$ConfigInternal.loadParsableParams(Configuration.java:204) …Run Code Online (Sandbox Code Playgroud) 场景:我想创建一个调度程序应用程序,它应该按照定义的计划运行shell脚本.为了简单起见,我希望用户在我的应用程序将使用的一些外部文件(properties/xml)中添加脚本名称和执行时间.目前,我计划在Linux服务器上运行此应用程序作为后台进程.将来我们可能会将其作为网络应用程序.
我到现在为止做了什么:
请建议一些有用的石英API,它可以帮助我实现这个目的.
更新:
public class CronTriggerExample {
public static void main(String[] args) throws Exception {
String[] a = {"script1.sh:0/10 * * * * ?", "script2.sh:0/35 * * * * ?"};
for (String config : a) {
String[] attr = config.split(":");
System.out.println("Iterating for : "+attr[0]);
JobKey jobKey = new JobKey(attr[0], attr[0]);
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity(attr[0], attr[0])
.withSchedule(CronScheduleBuilder.cronSchedule(attr[1]))
.build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.getContext().put("val", config);
JobDetail job …Run Code Online (Sandbox Code Playgroud) quartz-scheduler ×10
java ×7
spring ×5
guice ×1
hibernate ×1
java-ee ×1
jboss ×1
jboss-4.2.x ×1
jdbc ×1
mbeans ×1
servlets ×1
spring-boot ×1