2012-10-08 54 views
18

我想知道如何在Quartz中外部传递一个实例变量?如何将实例变量传递到Quartz作业?

下面是我想写的伪代码。我如何将externalInstance传递给这个Job?

public class SimpleJob implements Job { 
     @Override 
     public void execute(JobExecutionContext context) 
       throws JobExecutionException { 

      float avg = externalInstance.calculateAvg(); 
     } 
} 
+0

注入externalInstance在你的工作 – Anshu

回答

39

您可以把您的实例在schedulerContext.When你要安排工作,只是你可以在下面做之前:

getScheduler().getContext().put("externalInstance", externalInstance); 

你的任务类将是象下面这样:

public class SimpleJob implements Job { 
    @Override 
    public void execute(JobExecutionContext context) 
      throws JobExecutionException { 
     SchedulerContext schedulerContext = null; 
     try { 
      schedulerContext = context.getScheduler().getContext(); 
     } catch (SchedulerException e1) { 
      e1.printStackTrace(); 
     } 
     ExternalInstance externalInstance = 
      (ExternalInstance) schedulerContext.get("ExternalInstance"); 

     float avg = externalInstance.calculateAvg(); 
    } 
} 

如果你正在使用Spring,你可以实际使用Spring的支持,注入整个的applicationContext喜欢回答的Link

+0

这对于可序列化的对象工作正常,并且它将适用于您有权访问的类。如果我想从外部瓶子注入东西会怎么样? 例如,我试图编写一个StatefulJob,它列出自某个日期以来S3存储桶中的所有文件,并存储它在JobDetailMap中列出的文件。我想将一台配置AmazonS3Client的弹簧注入到我的工作中。我不能这样做,因为该类不是可序列化的,所以我必须注入密钥,访问密钥和编写代码来管理s3客户端的创建。这是做这件事的最好方法吗?任何的意见都将会有帮助。 –

+0

回答我自己的问题 - autowire这项工作,发现这真的很好的解决方案在线 - http://stackoverflow.com/questions/4258313/how-to-use-autowired-in-a-quartz-job –

+1

优秀的工作。帮助过我。 –

5

在使用触发调度工作,你就已经定义了被添加到JobDetailJobDataMap。该JobDetail对象将出现在您的Job中传递给​​方法的JobExecutionContext中。所以,你应该想办法通过JobDataMap来传递你的externalInstance。 HTH。

+0

外部比如我的意思可以是任何自定义数据类型,不限于本地数据类型,如String,浮动,Int等我从文档中读取,它说实例需要可序列化。 – janetsmith

+0

在我们的例子中,要处理的对象是数据库对象,因此我们使用条件从数据库中检索它们,存储在JobDataMap中,并在execute方法中检索它们。所以,你还需要找出一种方法来传递从某个商店中检索外部实例所需的信息,如果你不能使它们都是可序列化的。 – Vikdor

0

这是responsib JobFactory。默认的PropertySettingJobFactory实现将根据schdeuler上下文中找到的属性,触发器和作业细节调用任何bean设置器方法。所以只要你有implemnted适当setContext() setter方法,你应该能够做到以下任何一项:

scheduler.getContext().put("context", context); 

或者

Trigger trigger = TriggerBuilder.newTrigger() 
    ... 
    .usingJobData("context", context) 
    .build() 

或者

JobDetail job = JobBuilder.newJob(SimpleJob.class) 
    ... 
    .usingJobData("context", context) 
    .build() 

或者如果ISN如果你愿意的话,你可以提供你自己的JobFactory类来实例化Job对象。

0

通过创建一个接口与一个接口来解决此问题HashMap将所需信息放在那里。

在你的Quartz Job类中实现这个接口,这个信息将被访问。

IFace

Map<JobKey,Object> map = new HashMap<>(); 

Job

map.get(context.getJobDetail().getKey()) => will give you Object 
相关问题