标签: quartz-scheduler

石英和弹簧 - 聚集但不持久?

在我的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,因为我认为这就是它所做的.

有任何想法吗?我只想使用数据库进行聚类,而不是任何类型的持久性.

java spring load-balancing quartz-scheduler

10
推荐指数
1
解决办法
6275
查看次数

在我的石英工作中注射

我想知道如何使用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)

java servlets guice quartz-scheduler

10
推荐指数
1
解决办法
6061
查看次数

如何禁用Quartz JDBCJobStore中的作业?

在不删除作业或触发记录且不擦除cron表达式的情况下,在JDBCJobStore中禁用作业的最佳方法是什么?

java spring jdbc quartz-scheduler

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

石英调度程序示例程序给出错误

我正在尝试运行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

java quartz-scheduler

10
推荐指数
1
解决办法
7118
查看次数

如何将Quartz Scheduler连接到Spring上下文中?

我有一个应用程序,我想使用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?我错过了配置步骤吗?

java spring quartz-scheduler

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

分布式环境中的弹簧石英/ cron作业

我有一个大约5台服务器的车队.我想在每台机器上运行相同的Spring/Tomcat应用程序.

我还需要每十分钟执行一次特定任务.它应该只在其中一台机器上运行.我需要某种选举协议或其他类似的解决方案.

Spring或Quartz是否有任何内置的分布式cron解决方案,或者我是否需要自己实现?

spring quartz-scheduler

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

Quartz - 如何关闭和重启调度程序?

我得到的调度程序如下:

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()后调度程序无法重启"

你能告诉我如何解决这个问题吗?

提前谢谢,凯西尔

quartz-scheduler

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

Spring Boot:在Quartz作业执行中使用@Service

在一个应用程序中,由于我将它从经典的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)

java spring hibernate quartz-scheduler spring-boot

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

调用在jboss mbean中声明的quartz作业期间的java.lang.NoSuchMethodError

我在一个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

  • ejb.jar
  • app.war

我的第二个耳结构:

  • META-INF
    • application.xml中
    • 的jboss-app.xml中
  • ANTLR运行时,3.2.jar
  • ejb2.jar
  • app2.war

的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)

jboss mbeans quartz-scheduler java-ee jboss-4.2.x

9
推荐指数
1
解决办法
1156
查看次数

使用Quartz中的property/xml文件作为作业动态添加脚本

场景:我想创建一个调度程序应用程序,它应该按照定义的计划运行shell脚本.为了简单起见,我希望用户在我的应用程序将使用的一些外部文件(properties/xml)中添加脚本名称和执行时间.目前,我计划在Linux服务器上运行此应用程序作为后台进程.将来我们可能会将其作为网络应用程序.

我到现在为止做了什么:

  1. 我遇到xmlschedulingdataprocessorplugin了这个目的,但它要求用户将作业编写为Java代码,然后将其添加到XML文件中.
  2. 我找到了一些目前无效的调度示例.

请建议一些有用的石英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)

java quartz-scheduler

9
推荐指数
1
解决办法
883
查看次数