Java 使用dropwizard Sundian安排作业

Java 使用dropwizard Sundian安排作业,java,job-scheduling,Java,Job Scheduling,我正在尝试使用dropwizard Sundian,但遇到资源问题。我不确定这是一个类路径问题还是我没有正确注册资源 这是我的应用程序类的运行方法: public void run(DataLoaderApplicationConfiguration configuration, Environment environment) throws Exception { logger.info("Started DataLoader Application"); final Stri

我正在尝试使用dropwizard Sundian,但遇到资源问题。我不确定这是一个类路径问题还是我没有正确注册资源

这是我的应用程序类的运行方法:

public void run(DataLoaderApplicationConfiguration configuration, Environment environment) throws Exception {
    logger.info("Started DataLoader Application");
    final String template = configuration.getTemplate();
    environment.healthChecks().register("TemplateHealth", new TemplateHealthCheck(template));
    // JOBS
    environment.jersey().packages("com.tradier.dataloader.jobs");
}
我在运行时遇到以下错误:

INFO  [2015-04-07 15:00:19,737] com.xeiam.sundial.plugins.AnnotationJobTriggerPlugin: Loading annotated jobs from com.tradier.dataloader.jobs.

[WARNING] 
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.RuntimeException: Unexpected problem: No resource for com/tradier/dataloader/jobs
at org.quartz.classloading.CascadingClassLoadHelper.getJobClasses(CascadingClassLoadHelper.java:217)
at com.xeiam.sundial.plugins.AnnotationJobTriggerPlugin.start(AnnotationJobTriggerPlugin.java:72)
at org.quartz.QuartzScheduler.startPlugins(QuartzScheduler.java:1102)
at org.quartz.QuartzScheduler.start(QuartzScheduler.java:211)
at com.xeiam.sundial.SundialJobScheduler.startScheduler(SundialJobScheduler.java:102)

这似乎是一个类路径问题。 发件人:

我在dropwizard项目中也使用了日晷,我在jobs.xml中定义了所有作业,在.yaml文件中定义了日晷配置,并按如下方式启动它:

     SundialJobScheduler.startScheduler();
     SundialManager sm = new SundialManager(config.getSundialConfiguration(),environment); 
     environment.lifecycle().manage(sm);

请在上查看一个工作示例。它使用带注释的作业。您需要在config.yaml文件中添加包含注释作业的包名,如下所示:

sundial:
  thread-pool-size: 5
  shutdown-on-unload: true
  wait-on-shutdown: false
  start-delay-seconds: 0
  start-scheduler-on-load: true
  global-lock-on-load: false
  annotated-jobs-package-name: org.knowm.xdropwizard.jobs

如果仍然出现异常,请在以下位置留下报告:。

@Jeyashree Narayanan,作业包不应如您所示在应用程序类中配置,可以在yml文件中轻松完成。以下是简单步骤的说明:

步骤1:在yml文件和配置类中进行配置

sundial:
  thread-pool-size: 10
  shutdown-on-unload: true
  start-delay-seconds: 0
  start-scheduler-on-load: true
  global-lock-on-load: false
  annotated-jobs-package-name: com.tradier.dataloader.jobs
  tasks: [startjob, stopjob]
配置类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class DropwizardSundialConfiguration extends Configuration {

    @Valid
    @NotNull
    public SundialConfiguration sundialConfiguration = new SundialConfiguration();

    @JsonProperty("sundial")
    public SundialConfiguration getSundialConfiguration() {
        return sundialConfiguration;
    }
}
步骤2:在应用程序类中添加和配置dropwizard Sundail捆绑包

public class DropwizardSundialApplication extends Application<DropwizardSundialConfiguration> {

    private static final Logger logger = LoggerFactory.getLogger(DropwizardSundialApplication.class);

 public static void main(String[] args) throws Exception {
  new DropwizardSundialApplication().run("server", args[0]);
 }

    @Override
    public void initialize(Bootstrap<DropwizardSundialConfiguration> b) {
  b.addBundle(new SundialBundle<DropwizardSundialConfiguration>() {

   @Override
   public SundialConfiguration getSundialConfiguration(DropwizardSundialConfiguration configuration) {
    return configuration.getSundialConfiguration();
   }
  });
 }
}

我还写了一篇博客文章和一个工作应用程序,可以在GitHub上使用这些步骤。请检查:

谢谢Rahul。我将我的项目设置为使用jobs.xml,这很好。但是,如果我尝试使用带注释作业的另一个选项,CascadingCLassLoadHelper将无法识别资源(包含作业类的目录)。好奇地想知道这个选项是否对你有用,或者它是否是一个bug。你的意思是用注释定义一个作业吗?或者只是开始一个已经在jobs.xml中定义的作业?我还没有尝试过,我的所有作业都在xml文件中,并根据其cron时间表启动。我的意思是用注释定义一个作业,并将该文件夹包含在config.yaml文件中。如果我这样做,文件夹中的类不会被加载,我会得到一个异常。jobs.xml文件选项工作正常,但注释选项有问题。如果你碰巧试一试,我会很感激你的经验。谢谢
public class DropwizardSundialApplication extends Application<DropwizardSundialConfiguration> {

    private static final Logger logger = LoggerFactory.getLogger(DropwizardSundialApplication.class);

 public static void main(String[] args) throws Exception {
  new DropwizardSundialApplication().run("server", args[0]);
 }

    @Override
    public void initialize(Bootstrap<DropwizardSundialConfiguration> b) {
  b.addBundle(new SundialBundle<DropwizardSundialConfiguration>() {

   @Override
   public SundialConfiguration getSundialConfiguration(DropwizardSundialConfiguration configuration) {
    return configuration.getSundialConfiguration();
   }
  });
 }
}
@CronTrigger(cron = "0 19 13 * * ?")
public class CronJob extends Job {

    private static final Logger logger = LoggerFactory.getLogger(CronJob.class);
    @Override
    public void doRun() throws JobInterruptException {
        logger.info("Hello from Cron Job");
    }
}