• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > Java定时任务详解

Java定时任务详解

作者:wuzhiyuan 字体:[增加 减小] 来源:互联网 时间:2017-05-28

wuzhiyuan 通过本文主要向大家介绍了java泛型详解,java file类详解,java io流详解,java集合类详解,java io详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

定时任务在项目中经常会使用到,本文主要根据博主自己使用定时的经验分如下几点介绍定时任务:

1、Quartz定时任务简介及Spring配置Quartz定时任务

2、SchedulerFactory对定时任务进行增删改查

3、总结

Quartz定时任务简介:

Quartz是项目中经常用到的定时任务之一,是一个完全由java编写的开源作业调度框架,可以与J2EE与J2SE应用程序相结合也可以单独使用,其主要组成部分包括Job、Scheduler、CronExpression,这里就不一一介绍了,下面介绍Spring如何配置Quartz。

配置Quartz需要明白的一点是配置Quartz即配置Job、Scheduler和CronExpression,这三部分配置完成后,就是一个完整的定时任务,配置如下:

<bean id= "TestJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> 
  <property name="jobClass" value="xx.TestQuartzJob"/>
  <!-- 可以封装各种数据到JobExecutionContext里,包括接口、类,其中testServiceImpl是Spring管理的Bean,需要什么声明 --> 
  <property name="jobDataAsMap"> 
    <map> 
      <entry key="test" value="test"/>
      <entry key ="testServiceImpl" value-ref="testServiceImpl"/>
    </map> 
  </property> 
</bean>

<bean id= "TestTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
  <property name="jobDetail" ref="TestJobDetail" /> 
  <property name="cronExpression" value="0 0/1 * * * ?" />
</bean>

<bean id= "testSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
  <property name="triggers" > 
    <list> 
      <ref bean="TestTrigger" /> 
    </list> 
  </property> 
</bean>
<bean id="testServiceImpl" class="xx.service.impl.TestServiceImpl">

</div>

配置完成后,就是增加一个为你执行一个任务的Java类。每一个Quartz Job必须有一个 实现了org.quartz.Job接口的具体类,代码如下:

public class TestQuartzJob extends QuartzJobBean {
  @Override
  protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException
  {
    // 获取Job配置的接口
    TestServiceImpl testServiceImpl = (TestServiceImpl) arg0.getJobDetail().getJobDataMap().get("testServiceImpl");
    // 执行业务方法
    quartzStart();
  }
  public void quartzStart(){
    // 业务方法...
  }
}

</div>

当然,在Job中其实不用特意的配置接口,使用Spring的注入即可,这里只是把这个配置接口的方法进行说明。

到这里,简单的配置Quartz定时任务已经完成,下面附加一个我在项目中使用Quartz的情形:cronExpression表达式从数据库读取。

当时,我解决这个问题的方法是继承org.springframework.scheduling.quartz.CronTriggerBean,设置cronExpression,具体代码如下:

Trigger的配置要改:

<bean id="TestTrigger" class="xx.InitCronTriggerFactoryBean">
  <property name="jobDetail" ref="TestJobDetail" />
  <property name="key" value="key" />
</bean>
</div>

xx.InitCronTriggerFactoryBean代码:

public class InitCronTriggerFactoryBean extends CronTriggerFactoryBean implements Serializable {

  private static final long serialVersionUID = 1L;

  @Resource
  private SysParamService sysParamService;

  private String key;

  public void setKey(String key)
  {
    this.key = key;

    setCronExpression(getCronExpressionFromDB());
  }

  private String getCronExpressionFromDB()
  {
    if(StringUtils.isEmpty(key))
      return "0 0/5 * * * ?";

    SysParam sysParam = new SysParam();

    try
    {
      sysParam = sysParamService.getNameByKey(key);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }

    if(sysParam != null && !StringUtils.isEmpty(sysParam.getParamValue()))
      return sysParam.getParamValue();

    return "0 0/5 * * * ?";
  }
}

</div>

其中,SysParamService是根据key到数据库查询对应的cronExpression表达式的接口,这个接口除了使用Spring注入,也可以使用set方法设置,如下:

<bean id="TestTrigger" class="xx.InitCronTriggerFactoryBean">
  <property name="jobDetail" ref="TestJobDetail" />
  <property name="key" value="key" />
  <property name="sysParamService" ref="sysParamService" />
</bean>
<bean id="sysParamService" class="xx.service.impl.SysParamServiceImpl">

</div>

这样,在xx.InitCronTriggerFactoryBean就要加入sysParamService的set方法,此时的xx.InitCronTriggerFactoryBean代码为:

public class InitCronTriggerFactoryBean extends CronTriggerFactoryBean implements Serializable {
  private static final long serialVersionUID = 1L;
  private SysParamServiceImpl sysParamService;
  private String key;
  public void setKey(String key)
  {
    this.key = key;
  }
  public void setSysParamService(SysParamServiceImpl sysParamService)
  {
    this.sysParamService = sysParamService;
    setCronExpression(getCronExpressionFromDB());
  }
  private String getCronExpressionFromDB()
  {
    if(StringUtils.isEmpty(key))
      return "0 0 0/1 * * ?";
    SysParam sysParam = new SysParam();
    try
    {
      sysParam = sysParamServiceImpl.getNameByKey(key);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    if(sysParam != null && !StringUtils.isEmpty(sysParam.getParamValue()))
      return sysParam.getParamValue();
    return "0 0 0/1 * * ?";
  }
}

</div>

Quartz定时任务到这里就差不多了,基本的配置和使用就是上面将的,想要深入了解Quartz可以在网上查找更多的资料,并在实践中使用。接下来将讲解在项目中使用的可以随时对定时任务进行增删改查操作的实例。

定时任务的增删改查,其实可以看做是对数据进行增删改查。不过,定时任务的增删改查是操作Job和Trigger,具体代码如下:

定时任务管理器代码:

public class QuartzManager {

  private static final Logger logger = LogPresident.getRootLogger();

  private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();

  private static Map<String, JobKey> jobKeyMap = new HashMap<String, JobKey>();

  /**
  * 增加一个定时任务
  * @author zhiyuan.wu
  * @date 2017年3月30日
  * @param jobName
  * @param triggerName
  * @param cls
  * @param date
  */
  @SuppressWarnings({ "rawtypes", "unchecked" })
  public static void addJob(String jobName, String triggerName, Class cls, Date date)
  {
    try
    {
      Scheduler scheduler = schedulerFactory.getScheduler();

      // job
      JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, Scheduler.DEFAULT_GROUP).build();

      // 触发器
      SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity(triggerName, Scheduler.DEFAULT_GROUP).startAt(date).build();

      scheduler.scheduleJob(jobDetail, trigger);

      // 启动
      scheduler.start();

      jobKeyMap.put(jobDetail.getKey().getName(), jobDetail.getKey());
    }
    catch (Exception e)
    {
      logger.error("--------添加定时任务出错:" + e.getMessage(



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Java 回调函数详解及使用
  • 常用Java排序算法详解
  • Java创建内部类对象实例详解
  • 详解Java动态加载数据库驱动
  • Java中泛型使用实例详解
  • Java中的对象和引用详解
  • java回调机制实例详解
  • java服务端微信APP支付接口详解
  • Java定时任务详解
  • Java实现一个达达租车系统的步骤详解

相关文章

  • 2017-05-28Java 操作Properties配置文件详解
  • 2017-05-28MyBatis 使用权威指南
  • 2017-05-28Spring Boot如何使用Spring Security进行安全控制
  • 2017-05-28C# 中Excel导入时判断是否被占用三种方法
  • 2017-05-28详解Spring MVC4 纯注解配置教程
  • 2017-05-28javamail实现注册激活邮件
  • 2017-05-28详解Spring MVC4 纯注解配置教程
  • 2017-05-28Spring Data JPA 简单查询--方法定义规则(详解)
  • 2017-05-28Java微信公众平台开发(5) 文本及图文消息回复的实现
  • 2017-05-28Java中的vector类使用方法示例详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • springboot + mybatis配置多数据源示例
    • Java 7大常见排序方法实例详解
    • Java中IO流详解
    • java 基础之final、finally和finalize的区别
    • java 中如何获取字节码文件的相关内容
    • 详解java中通过post方式访问后台服务器
    • springMvc注解之@ResponseBody和@RequestBody详解
    • 反应式编程(Reactive Programming)
    • java.net.MalformedURLException异常的解决方法
    • 详解Spring框架之基于Restful风格实现的SpringMVC

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有