标签: quartz-scheduler

Quartz.Net - 延迟一个简单的触发器启动

我在 Quartz 中设置了一些作业以设定的时间间隔运行。问题是,当服务启动时,它会尝试立即启动所有作业……有没有办法使用 .xml 配置为每个作业添加延迟?

以下是 2 个作业触发器示例:

 <simple>
    <name>ProductSaleInTrigger</name>
    <group>Jobs</group>
    <description>Triggers the ProductSaleIn job</description>
    <misfire-instruction>SmartPolicy</misfire-instruction>
    <volatile>false</volatile>
    <job-name>ProductSaleIn</job-name>
    <job-group>Jobs</job-group>
    <repeat-count>RepeatIndefinitely</repeat-count>
    <repeat-interval>86400000</repeat-interval>        
  </simple>

 <simple>
    <name>CustomersOutTrigger</name>
    <group>Jobs</group>
    <description>Triggers the CustomersOut job</description>
    <misfire-instruction>SmartPolicy</misfire-instruction>
    <volatile>false</volatile>
    <job-name>CustomersOut</job-name>
    <job-group>Jobs</job-group>
    <repeat-count>RepeatIndefinitely</repeat-count>
    <repeat-interval>43200000</repeat-interval> 
  </simple>
Run Code Online (Sandbox Code Playgroud)

如您所见,有 2 个触发器,第一个每天重复,下一个每天重复两次。

我的问题是我希望第一个或第二个工作在另一个之后开始几分钟......(因为它们最终都访问相同的 API,我不想使请求过载)

是否有重复延迟或优先级属性?我找不到任何文件这样说..

quartz-scheduler quartz.net

5
推荐指数
1
解决办法
8297
查看次数

我可以在石英调度程序作业中使用 CDI 注入吗?

我正在使用 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

5
推荐指数
1
解决办法
4442
查看次数

Quartz 与 Spring 未提交

我使用石英、Spring 和 Hibernate 作为 JPA 提供程序。数据库是甲骨文。

我有一种方法可以将文件写入文件系统并使用详细信息更新数据库。可以通过两种方式调用此方法:

  1. 使用网络服务
  2. 或者,作为预定的 quatrz 作业。

我已将石英设置为:

<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

总结我的问题,这就是我想要实现的目标:

  1. 在员工表中创建一条新记录。
  2. 将employee_id 保存在job_store(石英)中。
  3. 当触发器被触发时,quartz 返回employee_id
  4. 根据此键检索(加载)员工记录。
  5. 向员工发送电子邮件
  6. 更新状态为“已发送”的通知(插入语句)

最后,我希望所有表格都得到更新。 …

spring hibernate jpa quartz-scheduler

5
推荐指数
1
解决办法
6584
查看次数

Quartz调度程序中断工作?

我有一份石英工作。我需要通过 UI 停止它的处理。我们提供了一个按钮,用户可以在其中单击STOP按钮,然后应停止当前正在运行的进程。但应该恢复进一步的调度。我用谷歌搜索并发现InterruptableJob了石英。

我的问题是,考虑到作业触发了存储过程执行,并且存储过程可能需要很长时间才能完成其执行。我相信InterruptableJob不能使用 InterruptableJob 的中断方法终止存储过程的执行。请有人解释一下在哪种情况下interrupt() of InterruptableJob有用?

我浏览了 http://www.quartz-scheduler.org/api/2.0.0/org/quartz/InterruptableJob.html但不知道在哪种情况下我需要使用它。

谢谢!

java spring scheduling quartz-scheduler

5
推荐指数
0
解决办法
1万
查看次数

javax.resource.ResourceException:事务不活跃:

在两三天后的生产中,我们开始收到以下异常:

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 天后所有作业失败。

我曾尝试增加事务超时但没有成功。

请帮助我解决这个问题。

java jobs transactions quartz-scheduler

5
推荐指数
0
解决办法
2708
查看次数

停止石英调试日志记录 log4j

我一直试图关闭烦人的石英调试日志记录。我正在使用 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)

java logging log4j quartz-scheduler

5
推荐指数
1
解决办法
2万
查看次数

基于文件存在的石英触发器?

我对使用 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 …

c# quartz-scheduler quartz.net

5
推荐指数
1
解决办法
1759
查看次数

无法存储名称为:'trigger1' 和组:'group1' 的触发器,因为已存在具有此标识的触发器

在石英中引用删除触发器

我遇到了同样的问题:无法存储名称为:'schedulerJobTrigger' 和组:'group1' 的触发器,因为已经存在具有此标识的触发器。

所以在我考虑取消工作安排之前,我有一个查询:

假设我有 2 个工作.. 详细信息如下: 工作 1:今天开始时间 @ 17:30,每 5 分钟后重复两次工作 2:今天开始时间 @ 17:37

因此,如果我在 17:30 执行后取消调度作业(应该删除触发器)并执行 Job2,那么调度程序将如何运行需要分别在 @17:35 和 17:40 运行的 Job1(这是重复)

谢谢,请帮忙!

在尝试上述场景之前,即使我用不同的日程安排了一个新工作@ scheduler.scheduleJob(job, trigger); 它给了我一个例外:无法存储名称为:'schedulerJobTrigger' 和组:'group1' 的触发器,因为已经存在具有此标识的触发器。

cron scheduler quartz-scheduler crontrigger

5
推荐指数
1
解决办法
7072
查看次数

Quartz.net Scheduler 使用集群

我正在使用集群选项,但我遇到了一些问题:

  1. 当我使用两台机器时,我创建的作业在开始时运行,与他们的定义无关。例如:如果我将作业定义为每 10 秒运行一次,它可以在开始时每两秒运行一次,并且只有从第 2 次运行它才正确 - 每 10 秒。

  2. 两台机器在同一分钟内(但不是在同一毫秒内)执行相同的工作并一起运行两次工作,我尝试使用锁处理程序属性,但也许我没有很好地定义它..

这是我的代码:

NameValueCollection properties = new NameValueCollection();

properties["quartz.scheduler.instanceName"] = "TestSchedulerNECH";
properties["quartz.scheduler.instanceId"] = "instance_one";
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "200";
properties["quartz.threadPool.threadPriority"] = "Normal";
properties["quartz.jobStore.misfireThreshold"] = "60000";
properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
properties["quartz.jobStore.useProperties"] = "false";
properties["quartz.jobStore.dataSource"] = "default";
properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
properties["quartz.jobStore.clustered"] = "true";
properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";
properties["quartz.dataSource.default.connectionString"] = "Server=localhost;Database=mydb;Trusted_Connection=False;User=admin;Password=123456";
properties["quartz.dataSource.default.provider"] = "SqlServer-20";


ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();

string schedId = sched.SchedulerInstanceId;

for …
Run Code Online (Sandbox Code Playgroud)

.net c# quartz-scheduler quartz.net

5
推荐指数
1
解决办法
3589
查看次数

Quartz.net CancellationToken

在我的计划程序中,使用quartz.net v3实现,我正在尝试测试取消令牌的行为:

....
IScheduler scheduler = await factory.GetScheduler();
....
var tokenSource = new CancellationTokenSource();
CancellationToken ct = tokenSource.Token;
// Start scheduler
await scheduler.Start(ct);
// some sleep 
await Task.Delay(TimeSpan.FromSeconds(60));
// communicate cancellation
tokenSource.Cancel();
Run Code Online (Sandbox Code Playgroud)

我有一个无限运行的测试作业,并在Execute方法中检查取消令牌:

public async Task Execute(IJobExecutionContext context)
{
    while (true)
    {
        if (context.CancellationToken.IsCancellationRequested)
        {
            context.CancellationToken.ThrowIfCancellationRequested();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望当tokenSource.Cancel()被解雇时,作业将输入if并引发Exception。但这是行不通的。

.net c# scheduler quartz-scheduler quartz.net

5
推荐指数
1
解决办法
2256
查看次数