我是石英新手。我使用 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 表上,而无需编写程序。
例如,如果我将时间和适当的调度程序详细信息插入石英表中,并且如果我使用上述配置调用侦听器,它可以工作吗?
如果它有效,我需要配置哪些表以及哪些字段。
我对unix系统中使用的Cron表达式和使用Java Quartz的一个有点困惑。
Unix 使用的标准 cron 表达式的最左边条目代表“分钟”。但是 Quartz 使用的 cron 表达式使用最左边的条目来表示“第二”:
http://quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger
我想知道目前正在使用多少个版本的 cron 表达式?
如果我将标准版本的 cron 传递到 Quartz 中会发生什么?
多谢
我们有一个在其他环境下运行良好的石英应用程序。
但是当我们将它部署在有两个需求的集群环境中时,它就停止工作了。我所能看到的只是下面显示的大量日志。
有什么想法可能导致它吗?我确信这不是我们的代码,因为它从未经过任何任务处理程序。
[7/17/14 13:14:54:236 EDT] 00000025 JobStoreTX I org.quartz.impl.jdbcjobstore.JobStoreSupport recoverMisfiredJobs Handling 3 trigger(s) that missed their scheduled fire-time.
Run Code Online (Sandbox Code Playgroud)
更新 :
我怀疑这可能是由于事务隔离级别配置所致。当前,quartz 数据源配置为 TRANSACTION_READ_COMMITTED (CS)。关于合适的值有什么建议吗?
TRIGGERS 表也显示它从未被触发:
| NEXT_FIRE_TIME | PREV_FIRE_TIME | 优先事项 | 触发状态 | 触发类型 | 开始时间 | 时间结束 | CALENDAR_NAME | 失火_指令 |
|---|---|---|---|---|---|---|---|---|
| 1405630189133 | -1 | 5 | 等待 | 克朗 | 1405624813000 | 0 | 0 | |
| 1405630189139 | -1 | 5 | 等待 | 克朗 | 1405624813000 | 0 | 0 | |
| 1405630215140 | -1 | 5 | 等待 | 克朗 | 1405624813000 | 0 | 0 | |
| 1405630189126 | -1 | 5 | 等待 | 克朗 | 1405624813000 | 0 | 0 |
将quartz-scheduler添加到项目后,Tomcat的服务器日志会收到以下垃圾邮件:
[INFO] [talledLocalContainer] 12:15:06.319 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG o.quartz.core.QuartzSchedulerThread - 批量获取0个触发器
我正在尝试禁用该日志消息,该消息每 25 秒左右重复一次。我已经回答过同一问题的许多其他答案,例如:
...建议的方法都不起作用。
我在 中声明了以下依赖项pom.xml:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我已将以下log4j.properties设置添加到我的项目中:
log4j.rootLogger=OFF
log4j.logger.quartz=OFF
log4j.logger.o.quartz=OFF
log4j.logger.org.quartz=OFF
Run Code Online (Sandbox Code Playgroud)
...还有以下内容simplelogger.properties:
org.slf4j.simpleLogger.defaultLogLevel=error
Run Code Online (Sandbox Code Playgroud)
除了尝试链接答案之一建议的编程解决方案之外,该解决方案还应禁用所有日志记录,大致如下:
List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
loggers.add(LogManager.getRootLogger());
for ( Logger logger : loggers ) {
logger.setLevel(Level.OFF);
}
Run Code Online (Sandbox Code Playgroud)
这似乎禁用了除了石英运行时的日志消息 之外的所有内容。
有没有办法摆脱quartz 中的日志消息,而不需要修改quartz 源代码来删除它?
由于我还没有找到任何与这相关的东西可以给我带来灵感,所以我想我会在这里提出这个。
我最近对Quartz Job Scheduler做了很多工作,我已经在 RESTful Java Servlet 中实现了它,该 Servlet 应该提供基于 Sencha ExtJS 的 UI 用于创建作业。我们将 Authenticator 类与 DatabaseManager 结合使用,负责验证用户和所有其他特定于数据库的内容(使用 Hibernate)。
由于我们希望在我们开发的 Java 企业应用程序中使用它,因此我们需要为每个客户运行这个东西。我们还需要使用 JobStoreTX 在 MySQL 数据库上持久化数据(显然是为了集群),因此易失性 RAMJobStore 实现是一个禁忌。我知道官方文档并且 Quartz 本身似乎不支持多租户实现(请参阅Quartz Clustering)。
我们的设置看起来有点像这样(简化):
- 1+ 生产 Tomcat(提供应用程序逻辑)
- 1+ 生产 Apache(提供 ExtJS 前端和静态内容)
- n 个数据库(每个客户一个)
要添加更棘手的事情:
我们有特定于客户的遗留模块(每个客户都有自己的应用程序托管),而更多最新模块则通过与客户相关的访问进行集中托管。
在我看来,在每个客户数据库上创建 Quartz 相关的表是不够的,因为我们希望坚持简单、直接的设置(这意味着每个客户使用相同的表前缀等)只是为了避免复杂化在整个农场部署石英。
我已经考虑过将它与MariaDB MaxScale结合起来,并使用过滤器基于 RegEx 或类似的东西将 Quartz 路由到每个客户数据库,Quartz 只与 MaxScale 代理通信,但这对于我试图实现的目标来说似乎有点太多的开销我什至不确定这是否有效。
有什么东西可以让我使用 Quartz 进行多租户吗?您能否建议一种方法,使 Quartz 能够处理这个问题,因为我们需要为每个客户运行作业,但在“一个”Tomcat 上(实际上是集群和负载平衡的)?或者是否有其他产品/框架/库支持开箱即用的多租户?
非常感谢任何领导、想法或帮助!
我目前正在使用 Quartz 来执行作业调度任务,方法是通过文件jobs.xml中的以下行进行配置:quartz.properties
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
Run Code Online (Sandbox Code Playgroud)
现在,我想将我的工作存储在数据源中。我已将quartz.properties文件更改如下:
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
Run Code Online (Sandbox Code Playgroud)
我还在数据库中进行了所有其他配置更改quartz.properties,并使一切正常工作。问题是,我所有的作业和触发器都已写入jobs.xml,我需要以某种方式将它们导入数据库。
我能想到的唯一解决方案是通过 Java 代码创建作业和触发器并重新安排一切。但是,如果有像通过读取jobs.xml文件将所有作业和触发器导入数据库之类的东西,那就太好了。
有谁知道是否有类似的事情?我知道我可以编写一个程序来执行此操作,但如果已经有一个已实现的程序,我仍然想利用它。
谢谢
我需要一个 cron 表达式,从 2016 年 1 月 25 日开始,它每天中午 12 点都会触发。这就是我的想法:
0 0 12 25/1 * ? *
Run Code Online (Sandbox Code Playgroud)
但1月31日之后,下一次发射时间是2月25日。
有没有一个 cron 表达式可以做到这一点?如果没有我可以用什么?
我将 JDBC 作业存储与quartz 一起使用,因为在集群环境中管理作业。以下是我使用mysql的jdbc配置:
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName: MyScheduler
org.quartz.scheduler.instanceId: instance_one
org.quartz.scheduler.skipUpdateCheck: true
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 5
org.quartz.threadPool.threadPriority: 5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = quartz_cluster
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
#============================================================================
# Configure Datasources
#============================================================================
org.quartz.dataSource.quartz_cluster.driver = com.mysql.cj.jdbc.Driver
org.quartz.dataSource.quartz_cluster.URL = jdbc:mysql://localhost:3306/quartz_cluster
org.quartz.dataSource.quartz_cluster.user = root
org.quartz.dataSource.quartz_cluster.password = root
org.quartz.dataSource.quartz_cluster.maxConnections = 5
Run Code Online (Sandbox Code Playgroud)
每当我运行具有上述属性的夸脱时,我的作业就会开始执行,执行 4 次后,我会收到以下异常:
[ERROR] - [2016-09-15 …Run Code Online (Sandbox Code Playgroud) 我们正在使用 Quartz 2.2.1,并且发现客户和我们自己的站点发生以下异常。石英桌似乎已损坏。
有谁见过这个或知道如何解决它?
更新
2017-04-18 00:01:38,685 ERROR org.quartz.impl.jdbcjobstore.JobStoreTX MisfireHandler: Error handling misfires: Couldn't retrieve trigger: No record found for selection of Trigger with key: 'DEFAULT.Delete PS Audit logs' and statement: SELECT * FROM QRTZ_SIMPLE_TRIGGERS WHERE SCHED_NAME = 'MFTScheduler' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
org.quartz.JobPersistenceException: Couldn't retrieve trigger: No record found for selection of Trigger with key: 'DEFAULT.Delete PS Audit logs' and statement: SELECT * FROM QRTZ_SIMPLE_TRIGGERS WHERE SCHED_NAME = 'MFTScheduler' AND TRIGGER_NAME = ? AND TRIGGER_GROUP …Run Code Online (Sandbox Code Playgroud) 我知道这个问题已经被问过很多次了,但我找不到我的问题的答案。我正在尝试每 20 秒安排一次春季批次,但失败了。
QuartzConfiguration.java
@Configuration
public class QuartzConfiguration {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private JobLocator jobLocator;
@Bean
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(JobRegistry jobRegistry) {
JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor = new JobRegistryBeanPostProcessor();
jobRegistryBeanPostProcessor.setJobRegistry(jobRegistry);
return jobRegistryBeanPostProcessor;
}
@Bean
public JobDetailFactoryBean jobDetailFactoryBean() {
JobDetailFactoryBean jobfactory = new JobDetailFactoryBean();
jobfactory.setJobClass(QuartzJobLauncher.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("jobName", "Test_Job");
map.put("jobLauncher", jobLauncher);
map.put("jobLocator", jobLocator);
jobfactory.setJobDataAsMap(map);
jobfactory.setGroup("group");
jobfactory.setName("job");
return jobfactory;
}
// Job is scheduled after every 20 sec
@Bean
public CronTriggerFactoryBean cronTriggerFactoryBean() {
CronTriggerFactoryBean ctFactory = new CronTriggerFactoryBean(); …Run Code Online (Sandbox Code Playgroud) quartz-scheduler ×10
java ×5
cron ×2
crontrigger ×1
exception ×1
jakarta-ee ×1
logging ×1
mariadb ×1
maven ×1
multi-tenant ×1
mysql ×1
persistence ×1
slf4j ×1
spring-batch ×1
spring-boot ×1
tomcat ×1