我需要构建一个显示某种“作业队列”的图形用户界面。
我动态创建触发器并使用 安排它们jobScheduler.scheduleJob(trigger);。我还通过触发器的数据映射传递一些数据。
如何取回尚未触发的触发器列表?
我找到了一种获取当前正在运行的作业的方法,但无法获取已注册触发器的列表。
我是否应该自己维护这个列表,并在它完成执行时通过实现触发侦听器来删除内容?
我可以获取底层 JobStore 并调用 getTriggerNames() 或类似方法吗?但我怎样才能获得JobStore。我拥有的只是一个 Scheduler 实例(实际上是一个 StdScheduler),并且似乎无法从中获取 JobStore 实例。
(我使用 spring 从 SchedulerFactoryBean 获取 Scheduler)
我正在使用 Glassfish 和 CDI 进行注射,(大部分)成功。我似乎无法让 Quartz 作业与注入一起工作 - bean 注释为@Injectnever get injection 。
Quartz 是否使用某种不同的类加载器来阻止注入的发生?
我在 web.xml 中像这样配置 Quartz:
<context-param>
<param-name>quartz:config-file</param-name>
<param-value>quartz.properties</param-value>
</context-param>
<context-param>
<param-name>quartz:shutdown-on-unload</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>quartz:wait-on-shutdown</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>quartz:start-scheduler-on-load</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>
org.quartz.ee.servlet.QuartzInitializerListener
</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
我的quartz.properties 看起来像:
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.scheduler.instanceId = 1
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz-config.xml
org.quartz.plugin.jobInitializer.scanInterval = 10
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
Run Code Online (Sandbox Code Playgroud) dependency-injection glassfish quartz-scheduler cdi glassfish-3
我使用石英、Spring 和 Hibernate 作为 JPA 提供程序。数据库是甲骨文。
我有一种方法可以将文件写入文件系统并使用详细信息更新数据库。可以通过两种方式调用此方法:
我已将石英设置为:
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" scope="singleton">
<property name="autoStartup" value="true"/>
<property name="waitForJobsToCompleteOnShutdown" value="true"/>
<property name="overwriteExistingJobs" value="true"/>
<property name="dataSource" ref="dataSource"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">FileScheduler</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.jobStore.misfireThreshold">6000</prop>
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
<prop key="org.quartz.jobStore.driverDelegateClass">${driverDelegateClass}</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">5</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
</props>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
这种方法是使用 spring 管理的事务。
问题是当这个方法被石英调度器调用时,文件被创建但数据库没有更新(应该有两个表更新和一个表插入)。
我也启用了 hibernate show_SQL,但在调度程序的情况下,不会记录更新\插入语句。
尽管当 Web 服务请求调用此方法时,这可以正常工作。日志也显示更新\插入语句。
更新 1
总结我的问题,这就是我想要实现的目标:
最后,我希望所有表格都得到更新。 …
我正在使用石英调度程序来安排我的工作。我用过CronTrigger。但问题是触发器会被多次触发。这是我设置 cron 调度程序的代码..
SchedulerFactory schFactory = new StdSchedulerFactory();
Scheduler sched = null;
CronTrigger cronTrigger = null;
try {
sched = schFactory.getScheduler();
JobDetail jobDetail = new JobDetail("job1", "group1",SchedulerPBGC.class);
String cronTimerStr = "* 16 15 * * ? *";
LOG.warn("CRON TRIGGER FORMAT FOR PROCESSING PB GC DATA:"+cronTimerStr);
cronTrigger = new CronTrigger("SchedTrigger", "Group1", cronTimerStr);
sched.scheduleJob(jobDetail, cronTrigger);
sched.start();
LOG.warn("SCHEDULER REGISTERED FOR PROCESSING PB GC DATA : TIME :"+cronTimerStr);
} catch (SchedulerException se) {
LOG.error("SchedulerException Message::"+se.getLocalizedMessage());
}
Run Code Online (Sandbox Code Playgroud)
这里我的调度程序执行了作业 10 次...在这里你可以看到日志..
2012-06-20 15:16:50,001 DefaultQuartzScheduler_Worker-1 WARN test.SchedulerPBGC …Run Code Online (Sandbox Code Playgroud) 我有一份石英工作。我需要通过 UI 停止它的处理。我们提供了一个按钮,用户可以在其中单击STOP按钮,然后应停止当前正在运行的进程。但应该恢复进一步的调度。我用谷歌搜索并发现InterruptableJob了石英。
我的问题是,考虑到作业触发了存储过程执行,并且存储过程可能需要很长时间才能完成其执行。我相信InterruptableJob不能使用 InterruptableJob 的中断方法终止存储过程的执行。请有人解释一下在哪种情况下interrupt() of InterruptableJob有用?
我浏览了 http://www.quartz-scheduler.org/api/2.0.0/org/quartz/InterruptableJob.html但不知道在哪种情况下我需要使用它。
谢谢!
在两三天后的生产中,我们开始收到以下异常:
org.jboss.util.NestedSQLException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f572ada:f5ff:52482a05:11a4 status: ActionStatus.ABORTED >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f572ada:f5ff:52482a05:11a4 status: ActionStatus.ABORTED >)
at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:95)
at com.rwsol.syb.persistence.jdbc.JDBCDataStore.getPhysicalConnection(JDBCDataStore.java:146)
... 10 more
Caused by: javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f572ada:f5ff:52482a05:11a4 status: ActionStatus.ABORTED >
at org.jboss.resource.connectionmanager.TxConnectionManager.getManagedConnection(TxConnectionManager.java:370)
at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:496)
at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:941)
at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:89)
Run Code Online (Sandbox Code Playgroud)
我们正在为所有夜间石英作业使用专用的批处理服务器。由于这个问题,我们需要每 4-5 天重启一次批处理。2-3 天后,一个作业失败,然后第二天 2-3 个作业失败,最后 4-5 天后所有作业失败。
我曾尝试增加事务超时但没有成功。
请帮助我解决这个问题。
我一直试图关闭烦人的石英调试日志记录。我正在使用 log4j 作为日志记录框架,并且我已经尝试将此行添加到 lg4j 属性文件中
"log4j.logger.org.quartz=ERROR"
Run Code Online (Sandbox Code Playgroud)
我仍然收到大量这些调试日志消息
13:35:44.680 [MyScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
Run Code Online (Sandbox Code Playgroud)
我怎样才能关闭这个功能?
编辑。我已将我的配置移至 xml 文件...但仍然遇到同样烦人的问题
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />
</layout>
</appender>
<logger name="org.quartz" >
<level value="ERROR" />
<appender-ref ref="console" />
</logger>
<logger name="org.hibernate">
<level value="ERROR" />
<appender-ref ref="console" />
</logger>
<logger name="com.mchange.v2.c3p0" additivity="false">
<level value="ERROR" />
<appender-ref ref="console" />
</logger>
<root>
<priority value="ERROR" …Run Code Online (Sandbox Code Playgroud) 我使用quartz来调度我的作业,当我使用RAM作业存储时,调度程序启动并成功触发,但当我使用JDBC存储时,它无法启动。你能指导一下吗,我已经放置了以下文物,
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 2
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.dataSource.myDS.driver = org.hsqldb.jdbc.JDBCDriver
org.quartz.dataSource.myDS.URL = jdbc:hsqldb:file:x\\myds
org.quartz.dataSource.myDS.user = SA
org.quartz.dataSource.myDS.password = sa
org.quartz.dataSource.myDS.maxConnections = 30
Run Code Online (Sandbox Code Playgroud)
这些是我的日志...
2014-01-17 11:36:42 INFO MLog:80 - …Run Code Online (Sandbox Code Playgroud) 我是石英新手。我使用 mysql 配置了 jdbcjobstore,配置如下。如果我通过 java 创建调度程序,它工作正常。
# Main Quartz configuration
org.quartz.scheduler.skipUpdateCheck = true
org.quartz.scheduler.instanceName = DatabaseClusteredScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.jobFactory.class = org.quartz.simpl.SimpleJobFactory
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = quartzDataSource
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
# JobStore: JDBC jobStoreTX
org.quartz.dataSource.quartzDataSource.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.quartzDataSource.URL = jdbc:mysql://192.168.1.2:3306/fatdb
org.quartz.dataSource.quartzDataSource.user = root
org.quartz.dataSource.quartzDataSource.password = root
org.quartz.dataSource.quartzDataSource.maxConnections = 8
Run Code Online (Sandbox Code Playgroud)
我的问题是可以将条目(如调度程序、作业和其他信息)直接放在特定的 Quartz 表上,而无需编写程序。
例如,如果我将时间和适当的调度程序详细信息插入石英表中,并且如果我使用上述配置调用侦听器,它可以工作吗?
如果它有效,我需要配置哪些表以及哪些字段。
我对使用 Quartz 很陌生,我有一个关于触发器的问题。是否可以根据文件存在触发?我想让 Quartz 运行一项作业,直到找到某个文件,然后停止运行该作业,也许会继续进行另一个作业。
例如,我想做这样的事情:
(1) Job1 每 60 秒检查一次给定目录中是否存在 File.txt。
(2)如果找到File.txt,则触发Job2启动。Job1 停止检查文件是否存在。
现在,我有:
// Job definitions
var Job1 = JobBuilder.Create<TestEmail>().WithIdentity("job1", "group1").Build();
var Job2 = JobBuilder.Create<TestFileTrigger>().WithIdentity("job2", "group2").Build();
// Triggers
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1").StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
.Build();
ITrigger trigger2 = TriggerBuilder.Create()
.WithIdentity("trigger2", "group2").StartNow()
.Build();
// Schedule jobs
scheduler.ScheduleJob(Job1, trigger1);
if (TestFileTrigger.fileExistence == true)
{
scheduler.ScheduleJob(Job2, trigger2);
}
Run Code Online (Sandbox Code Playgroud)
但似乎 Job2 永远不会启动。
TestEmail 和 TestFileTrigger 目前只是简单地打印到控制台。布尔 TestFileTrigger.fileExistence 来自检查文件是否存在于给定位置(它确实存在)。
编辑: TestFileTrigger.fileExistence 是一个布尔值。如果有帮助,添加了 Job1/Job2 的定义。
编辑:我发现如果我放在Thread.Sleep(TimeSpan.FromSeconds(x));if 语句之前,如果满足条件,if 语句就会运行。(其中 x …
quartz-scheduler ×10
java ×5
spring ×2
c# ×1
cdi ×1
glassfish ×1
glassfish-3 ×1
hibernate ×1
jobs ×1
jpa ×1
log4j ×1
logging ×1
quartz.net ×1
scheduling ×1
transactions ×1