java中怎么实现即时QuartzJob注入Bean-成都创新互联网站建设

关于创新互联

多方位宣传企业产品与服务 突出企业形象

公司简介 公司的服务 荣誉资质 新闻动态 联系我们

java中怎么实现即时QuartzJob注入Bean

这篇文章主要讲解了“java中怎么实现即时Quartz Job注入Bean”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中怎么实现即时Quartz Job注入Bean”吧!

十多年的太和网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整太和建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“太和网站设计”,“太和网站推广”以来,每个客户项目都认真落实执行。

现今Spring已经成为企业级应用开发的事实框架,由于即时Quartz Job一般情况下不是Spring Bean,此时Job中就需要想办法获取Bean。

即时Job区别于周期/定时Job,是根据业务需要随时提交的Quartz Job,常见于界面提交后台的耗时任务(例如:导入/导出)。

接下来先简单看一下几种获取Spring Bean的方式:

第一种:定义AppCtxUtils工具类,用于获取Bean。

@Component
public class AppCtxUtils implements ApplicationContextAware {

  private static ApplicationContext appCtx;

  @Override
  public void setApplicationContext(ApplicationContext appCtx) throws BeansException {
    this.appCtx = appCtx;
  }

  public static ApplicationContext getAppCtx() {
    return appCtx;
  }

  public static  T getBean(Class clazz) {
    return appCtx.getBean(clazz);
  }
  
  public static  T getBean(String beanName) {
    return (T) appCtx.getBean(beanName);
  }
}
public class AppCtxUtilsExampleJob implements Job {

  private ExampleService exampleService = AppCtxUtils.getBean(ExampleService.class);
  // 此处省略...

  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    // 此处省略...
  }
}

点评:这是一种使用最广泛的一种方式。

第二种:通过JobDataMap参数的方式传递ApplicationContext或Bean。

public class JobDataMapExampleJob implements Job {
  // 定义KEY
  public static final String KEY_APP_CTX = "appCtx";

  // 此处省略...
  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    // 从JobDataMap中取出ApplicationContext
    ApplicationContext appCtx = (ApplicationContext) getJobDataMap(context).get(KEY_APP_CTX);
    // 通过ApplicationContext取各种Bean
    ExampleService exampleService = appCtx.getBean(ExampleService.class);
    // 此处省略...
  }

  private JobDataMap getJobDataMap(JobExecutionContext context) {
    return context.getJobDetail().getJobDataMap();
  }
}

第三种:JobDetail配置为prototype Bean。

  • 定义Job,使用注解注入Bean。

// 定义成Bean
@Component("prototypeJobDetailExampleJob")
public class PrototypeJobDetailExampleJob implements Job {
  // 采用注解注入
  @Autowired
  private ExampleService exampleService;

  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    // 此处省略...
  }
}
  • 配置prototype JobDetail Bean。


  
  
  
  
  
  • 立即调度

// 从Spring ApplicationContext中获取JobDetail。
JobDetail jobDetail = AppCtxUtils.getBean("prototypeJobDetailExampleJob.jobDetail");

// 此处省略代码

scheduler.addJob(jobDetail, false);
String myTrigger = UUID.randomUUID().toString();
Trigger trigger = TriggerBuilder.newTrigger() //
    .withIdentity(myTrigger, "groupName") //
    .forJob(jobDetail) //
    .startNow() //
    .build();
scheduler.scheduleJob(trigger);

点评:PrototypeJobDetailExampleJob以Spring Bean方式编写很简洁,但是配置和使用较复杂。

第四种:Spring提供对Quartz的支持的一种方式。

  • 定义Job

public class SchedulerContextExampleJob implements Job {
  // 定义KEY
  public static final String KEY_APP_CTX = "appCtx";

  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    try {
      ApplicationContext appCtx = getApplicationContext(context);
      // 通过ApplicationContext取各种Bean
      ExampleService exampleService = appCtx.getBean(ExampleService.class);

      // 此处代码省略
    } catch (Exception e) {
      throw new JobExecutionException(e);
    }
  }

  private ApplicationContext getApplicationContext(JobExecutionContext context)
      throws SchedulerException {
    // 从SchedulerContext中取出ApplicationContext
    return (ApplicationContext) context.getScheduler().getContext().get(KEY_APP_CTX);
  }
}
  • 配置JobDetail及Scheduler


  
  
  

以上四种写法要么写法冗长,要么配置复杂。对有强迫症的程序员够优雅,那么接下来介绍一种更优雅的方式。

优雅的写法

public class ExampleJob implements Job {
  @Autowired
  private ExampleService exampleService;

  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    // 此处省略...
  }
}

ExampleJob与第三种PrototypeJobDetailExampleJob的最大区别:ExampleJob非Spring Bean,但依然可以使用Spring注解进行Bean的注入。

那如何实现呢?

基本原理:将Quartz实例化的JOB对象实例在使用前让Spring容器帮忙注入。

废话不多说直接上代码。

  • 扩展SpringBeanJobFactory。

public class SpringAutowireCapableJobFactory extends SpringBeanJobFactory
    implements ApplicationContextAware {
  private ApplicationContext applicationContext;

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }

  @Override
  protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
    Object jobInstance = super.createJobInstance(bundle);
    // 此处用Spring处理对象
    applicationContext.getAutowireCapableBeanFactory().autowireBean(jobInstance);
    return jobInstance;
  }

}
  • 配置scheduler时指定jobFactory为SpringAutowireCapableJobFactory


  
    
  
  

感谢各位的阅读,以上就是“java中怎么实现即时Quartz Job注入Bean”的内容了,经过本文的学习后,相信大家对java中怎么实现即时Quartz Job注入Bean这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


分享名称:java中怎么实现即时QuartzJob注入Bean
文章分享:http://kswsj.cn/article/gdcopc.html

其他资讯