java三大框架实现任务调度——IRemindService

简介: java三大框架实现任务调度——IRemindService

        java实现任务调度,主要分为几个步骤:

           1.创建一个服务
           2.创建一个任务类,将服务作为一个任务去完成(实现job接口)
           3.创建一个任务类实体
           4.创建一个触发器,指定触发规则
           5.创建一个调度,绑定任务和触发器

接下来我们先看看IRemindService接口的代码:

/**  
* @Title: IRemindService.java
* @Package org.service
* @Description: TODO该方法的主要作用:
* @author A18ccms A18ccms_gmail_com  
* @date 2017-5-26 下午7:54:13
* @version V1.0  
*/
package org.service;
 /**   
 *    
 * 项目名称:spring_Schop07   
 * 类名称:IRemindService   
 * 类描述:   
 * 创建人:Mu Xiongxiong  
 * 创建时间:2017-5-26 下午7:54:13   
 * 修改人:Mu Xiongxiong   
 * 修改时间:2017-5-26 下午7:54:13   
 * 修改备注:   
 * @version    
 *    
 */
public interface IRemindService {
  
  void sendMsg();
  
  void sendMsg(String userName);
}

     它的实现类也很简单,简单看看就行,重点不在这里,这里只是拟定一个任务,主要的调度在后面:

/**  
* @Title: RemindServiceImpl.java
* @Package org.service.impl
* @Description: TODO该方法的主要作用:
* @author A18ccms A18ccms_gmail_com  
* @date 2017-5-26 下午7:55:19
* @version V1.0  
*/
package org.service.impl;
import org.service.IRemindService;
 /**   
 *    
 * 项目名称:spring_Schop07   
 * 类名称:RemindServiceImpl   
 * 类描述:   
 * 创建人:Mu Xiongxiong  
 * 创建时间:2017-5-26 下午7:55:19   
 * 修改人:Mu Xiongxiong   
 * 修改时间:2017-5-26 下午7:55:19   
 * 修改备注:   
 * @version    
 *    
 */
public class RemindServiceImpl implements IRemindService {
  /**(非 Javadoc)
   * <p>Title: sendMsg</p>
   * <p>Description(描述): </p>
   * @see org.service.IRemindService#sendMsg()
   */
  @Override
  public void sendMsg() {
    System.out.println("像张三发送一条信息!");
  }
  @Override
  public void sendMsg(String userName) {
    System.out.println("像"+userName+"发送一条信息!");
    
  }
}

要想实现任务调度,那么久得实现Job接口,具体代码如下:

/**  
* @Title: RemindJob.java
* @Package org.service.impl
* @Description: TODO该方法的主要作用:
* @author A18ccms A18ccms_gmail_com  
* @date 2017-5-26 下午7:58:09
* @version V1.0  
*/
package org.service.impl;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.service.IRemindService;
 /**   
 *    
 * 项目名称:spring_Schop07   
 * 类名称:RemindJob   
 * 类描述:   
 * 创建人:Mu Xiongxiong  
 * 创建时间:2017-5-26 下午7:58:09   
 * 修改人:Mu Xiongxiong   
 * 修改时间:2017-5-26 下午7:58:09   
 * 修改备注:   
 * @version    
 *    
 */
public class RemindJob implements Job {
  /**(非 Javadoc)
   * <p>Title: execute</p>
   * <p>Description(描述): 任务调度</p>
   * @param arg0
   * @throws JobExecutionException
   * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
   */
  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    IRemindService remindService = new  RemindServiceImpl();
    System.out.println("任务:"+context.getJobDetail().getName());
    remindService.sendMsg(context.getJobDetail().getJobDataMap().getString("user"));
  }
}


接下来看看spring里面是如何配置的:

<?xml version="1.0" encoding="UTF-8"?>
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
  <!-- 
    1.创建任务实体类 
    2.创建触发器
    3.创建调度(注入数据)
  -->
  <!-- <bean id="detailJob" class="org.springframework.scheduling.quartz.JobDetailBean">
     <property name="jobClass" value="org.service.impl.RemindJob"></property> 
     <property name="jobDataMap">
      <map>
        <entry key="user" value="王五"></entry>
      </map>
     </property>
  </bean> -->
  
  <bean id="remindService" class="org.service.impl.RemindServiceImpl"></bean>
  <!-- 讲普通的javaBean定义为任务,而省略了任务类 -->
  <bean id="detailJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="remindService"></property>
    <property name="targetMethod" value="sendMsg"></property>
    <property name="arguments">
      <list>
        <value>赵六</value>
      </list>
    </property>
  </bean>
  
  <!-- 简单触发器 -->
   <bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="repeatCount" value="-1"></property>
    <property name="repeatInterval" value="3000"></property>
    <property name="startDelay" value="1000"></property>
    <property name="jobDetail" ref="detailJob"></property>
  </bean> 
  
  <!-- 复杂触发器 -->
  <!-- <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="detailJob"></property>
    <property name="cronExpression" value="0 39 22 26 * ?"></property>
  </bean> -->
  
  <bean id="sche" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
        <ref bean="trigger"/>
      </list>
    </property>
  </bean>
</beans>


代码都编写完毕,我们来测试一下:

package org.service.impl;
import java.text.ParseException;
import java.util.Date;
import org.junit.Test;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * 
*    
* 项目名称:spring_Schop07   
* 类名称:RemindServiceImplTest   
* 类描述:   测试类
* 创建人:Mu Xiongxiong  
* 创建时间:2017-5-26 下午8:04:00   
* 修改人:Mu Xiongxiong   
* 修改时间:2017-5-26 下午8:04:00   
* 修改备注:   
* @version    
*
 */
public class RemindServiceImplTest {
  @Test
  public void testMethod() throws SchedulerException, InterruptedException, ParseException {
    //创建任务实体
    JobDetail jobDetail  = new JobDetail("job1","group1",RemindJob.class);
    //给任务传递数据
    jobDetail.getJobDataMap().put("user","李四");
    
    //创建简单触发器
    SimpleTrigger trigger = new SimpleTrigger("trigger1",SimpleTrigger.REPEAT_INDEFINITELY,3000);
    
    //复杂触发器
    //每个月的26号 21:20:00
    //CronTrigger trigger = new CronTrigger("tigger3","group2","0 30 21 26 * ?");
    //开始时间(当前毫秒数+1秒,延迟一秒)
    trigger.setStartTime(new Date(System.currentTimeMillis()+1000));
    //创建调度器
    SchedulerFactory sfc = new StdSchedulerFactory();
    Scheduler sche = sfc.getScheduler();
    //注册任务和触发器
    sche.scheduleJob(jobDetail, trigger);
    //启动任务工程
    sche.start();
    //延迟10000ms
    Thread.sleep(100000);
    //关闭
    sche.shutdown();
  }
  
  
  /**
   * @throws InterruptedException 
   * 
  * @Title: testSpring
  * @Description: 该方法的主要作用通过spring实现quartz
  * @param   设定文件  
  * @return  返回类型:void   
  * @throws
   */
  @Test
  public void testSpring() throws InterruptedException{
    ApplicationContext ctx = new  ClassPathXmlApplicationContext("applicationContext.xml");
    Thread.sleep(10000);
  }
}


目录
相关文章
|
1月前
|
算法 Java 数据处理
Java集合框架的优缺点
Java集合框架的优缺点
|
3天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
3天前
|
Java Nacos 开发者
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
Java从入门到精通:4.2.1学习新技术与框架——以Spring Boot和Spring Cloud Alibaba为例
|
3天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
8天前
|
Java Maven 开发工具
《Java 简易速速上手小册》第5章:Java 开发工具和框架(2024 最新版)
《Java 简易速速上手小册》第5章:Java 开发工具和框架(2024 最新版)
28 1
|
11天前
|
缓存 监控 Java
Java并发编程:线程池与任务调度
【4月更文挑战第16天】Java并发编程中,线程池和任务调度是核心概念,能提升系统性能和响应速度。线程池通过重用线程减少创建销毁开销,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。任务调度允许立即或延迟执行任务,具有灵活性。最佳实践包括合理配置线程池大小、避免过度使用线程、及时关闭线程池和处理异常。掌握这些能有效管理并发任务,避免性能瓶颈。
|
12天前
|
Java 大数据 云计算
Spring框架:Java后台开发的核心
【4月更文挑战第15天】Spring框架在Java后台开发中占据核心位置,因其控制反转(IoC)、面向切面编程(AOP)、事务管理等特性提升效率和质量。Spring提供数据访问集成、RESTful Web服务和WebSocket支持。优势包括高效开发、灵活扩展、强大生态圈和广泛应用。应用于企业级应用、微服务架构及云计算大数据场景。掌握Spring对Java开发者至关重要。
|
15天前
|
存储 Java 编译器
Java集合丛林:深入了解集合框架的秘密
Java集合丛林:深入了解集合框架的秘密
16 0
Java集合丛林:深入了解集合框架的秘密
|
19天前
|
存储 Java 数据库连接
java使用mp持久化框架,写入5000个字符,但是VARCHAR(255) 会报错
使用Java的MyBatis Plus框架时,如果尝试将超过VARCHAR(255)限制的字符串(如5000个字符)存入数据库,会抛出异常。解决方法是将列类型改为TEXT。可通过在实体类属性上添加`@TableField(typeHandler = JdbcType.CLOB)`注解,如`private String content;`,将属性映射到CLOB类型列,以存储更长字符串。
9 0
|
19天前
|
存储 Java
java反射——设计框架的灵魂
java反射——设计框架的灵魂