我需要在每个月的最后一天开始工作.我尝试了以下cron表达式:
<property name="cronExpression" value="0 0 3 L * * *" />
Run Code Online (Sandbox Code Playgroud)
但得到了这个错误:
Caused by: java.lang.UnsupportedOperationException: Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.
Run Code Online (Sandbox Code Playgroud)
它不喜欢它L,但没有使用它,我怎么能在这个月的最后一天运行?
我的构建路径中包含quartz 1.8.3.jar和Spring 3.0.6 jar,但是在spring + quartz调度的所有教程中出现的包都不可用.在哪里可以找到它?
"org.springframework.scheduling.quartz.JobDetailBean"
Run Code Online (Sandbox Code Playgroud) 我计划使用Quartz调度程序,因为我阅读了很多关于它的好意见.
我的问题如下:在任何给定时间,我将有数千个触发器存在于系统中.大多数触发器只会触发一个事件而死亡.此外,我很可能在分配后取消许多工作(基于新输入).
石英可以扩展到这个吗?建议使用哪个JobStore?我打算在mysql上使用JDBC.
添加信息:我的工作将通过HTTP发送电子邮件或将数据发布到其他服务(通过WAN).
在我的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中禁用作业的最佳方法是什么?
假设我有一个这样的简单控制器:
class FooController {
def index = {
someVeryLongCompution() //e.g crawl a set of web pages
render "Long computation was launched."
}
}
Run Code Online (Sandbox Code Playgroud)
当调用索引操作时,我希望该方法在异步运行长计算时立即返回给用户.
我理解最有效的方法是在架构中使用消息代理,但我想知道是否有更简单的方法来实现它.
我尝试了Executor插件,但阻止了http请求返回,直到长计算完成.
我尝试过Quartz插件,但这似乎对周期性任务有好处(除非有办法只运行一次作业?)
你们是如何在Grails中处理这些请求的呢?
我正在尝试将石英作业保存到数据库中.我已经设置了表,创建了quartz.properties文件,但是当我尝试运行应用程序时,会出现以下异常:
2012-02-01 17:36:23,708 [main] ERROR context.GrailsContextLoader - Error executing bootstraps: org.quartz.JobPersistenceException: Couldn't store trigger 'expirationTrigger' for 'com.pldtglobal.svngateway.ExpirationCheckerJob' job:Bad value for type long : \254\355\000\005sr\000\025org.quartz.JobDataMap\237\260\203\350\277\251\260\313\002\000\000xr\000&org.quartz.utils.StringKeyDirtyFlagMap\202\010\350\303\373\305](\002\000\001Z\000\023allowsTransientDataxr\000\035org.quartz.utils.DirtyFlagMap\023\346.\255(v\012\316\002\000\002Z\000\005dirtyL\000\003mapt\000\017Ljava/util/Map;xp\001sr\000\021java.util.HashMap\005\007\332\301\303\026`\321\003\000\002F\000\012loadFactorI\000\011thresholdxp?@\000\000\000\000\000\014w\010\000\000\000\020\000\000\000\001t\000'org.grails.plugins.quartz.grailsJobNamet\000.com.pldtglobal.svngateway.ExpirationCheckerJobx\000 [See nested exception: org.postgresql.util.PSQLException: Bad value for type long : \254\355\000\005sr\000\025org.quartz.JobDataMap\237\260\203\350\277\251\260\313\002\000\000xr\000&org.quartz.utils.StringKeyDirtyFlagMap\202\010\350\303\373\305](\002\000\001Z\000\023allowsTransientDataxr\000\035org.quartz.utils.DirtyFlagMap\023\346.\255(v\012\316\002\000\002Z\000\005dirtyL\000\003mapt\000\017Ljava/util/Map;xp\001sr\000\021java.util.HashMap\005\007\332\301\303\026`\321\003\000\002F\000\012loadFactorI\000\011thresholdxp?@\000\000\000\000\000\014w\010\000\000\000\020\000\000\000\001t\000'org.grails.plugins.quartz.grailsJobNamet\000.com.pldtglobal.svngateway.ExpirationCheckerJobx\000]
org.codehaus.groovy.runtime.InvokerInvocationException: org.quartz.JobPersistenceException: Couldn't store trigger 'expirationTrigger' for 'com.pldtglobal.svngateway.ExpirationCheckerJob' job:Bad value for type long : \254\355\000\005sr\000\025org.quartz.JobDataMap\237\260\203\350\277\251\260\313\002\000\000xr\000&org.quartz.utils.StringKeyDirtyFlagMap\202\010\350\303\373\305](\002\000\001Z\000\023allowsTransientDataxr\000\035org.quartz.utils.DirtyFlagMap\023\346.\255(v\012\316\002\000\002Z\000\005dirtyL\000\003mapt\000\017Ljava/util/Map;xp\001sr\000\021java.util.HashMap\005\007\332\301\303\026`\321\003\000\002F\000\012loadFactorI\000\011thresholdxp?@\000\000\000\000\000\014w\010\000\000\000\020\000\000\000\001t\000'org.grails.plugins.quartz.grailsJobNamet\000.com.pldtglobal.svngateway.ExpirationCheckerJobx\000 [See nested exception: org.postgresql.util.PSQLException: Bad value for type long : \254\355\000\005sr\000\025org.quartz.JobDataMap\237\260\203\350\277\251\260\313\002\000\000xr\000&org.quartz.utils.StringKeyDirtyFlagMap\202\010\350\303\373\305](\002\000\001Z\000\023allowsTransientDataxr\000\035org.quartz.utils.DirtyFlagMap\023\346.\255(v\012\316\002\000\002Z\000\005dirtyL\000\003mapt\000\017Ljava/util/Map;xp\001sr\000\021java.util.HashMap\005\007\332\301\303\026`\321\003\000\002F\000\012loadFactorI\000\011thresholdxp?@\000\000\000\000\000\014w\010\000\000\000\020\000\000\000\001t\000'org.grails.plugins.quartz.grailsJobNamet\000.com.pldtglobal.svngateway.ExpirationCheckerJobx\000]
at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212)
at grails.web.container.EmbeddableServer$start.call(Unknown Source)
at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy:158)
at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy)
at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:280)
at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy)
at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:149)
at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy)
at _GrailsRun_groovy.runInline(_GrailsRun_groovy:116) …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行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?我错过了配置步骤吗?
quartz-scheduler ×10
java ×7
spring ×4
grails ×2
scheduling ×2
servlets ×2
asynchronous ×1
crontrigger ×1
guice ×1
jdbc ×1
scalability ×1
scaling ×1