java定时任务管理

Quartz Scheduler,定时任务
Quartz是一个作业调度系统(a job scheduling system),负责在约定的时间到达时执行(或通知)其他软件控制。是一个Java的定时任务框架,使用它可以方便的实现计划任务,即在某个时间或每隔一定时间运行一个任务。Quartz的核心是Job/JobDetail,Trigger和Scheduler。
1.Job/JobDetail
       Job/JobDetail=既要执行的任务,可以通过实现Job(interface)中的excute方法来指定任务的具体操作。 他描述了一个任务具体的信息,比如名称,组名等等。JobDetail对象是在Quartz的客户端(我们的程序)在Job被关联加入到Scheduler时创建的,JobDetail包含了Job的各种属性值和   JobDataMap,JobDataMap中存放了与之相关的Job类实例的状态信息。

    2.Trigger
       用于控制一组Job的触发,包裹SimmperTrigger和CronTrigger,后者支持一种描述触发事件和间隔的表达式语言。Quartz有个很好的想法就是分离了任务和任务执行的条件。Trigger就是控制任务执行条件的类,当Trigger认为执行条件满足的时刻,Trigger会通知相关的Job去执行。分离的好处是:
            1).你可以为某个Job关联多个Trigger,其中任何一个条件满足都可以触发job执行,这样可以完成一些组合的高级触发条件
            2).当Trigger失效后(比如:一个永远都不能满足的条件),你不必去声明一个新的job,代替的是你可以为job关联一个新的Trigger让job可以继续执行。
  
    3.Scheduler是控制和管理触发器的启动和终止。
       使用Scheduler前必须实例化Scheduler,需要由SchedulerFactory类来创建Scheduler,Factory的实例可以通过在JNDI存储中的Factory的序列化的方式获取,实例化Factory后直接使用该实例很容易。如下:
Java代码  收藏代码
  1.        public class WangyouQuartzListener extends QuartzInitializerListener {  
  2.             public  static  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  3.   
  4.             public WangyouQuartzListener() {  
  5.                        super();  
  6.             }  
  7.   
  8.            public void contextInitialized(ServletContextEvent event) {  
  9.                     super.contextInitialized(event);  
  10.                     String factoryKey = event.getServletContext().getInitParameter("servlet-context-factory-key");  
  11.                      if (factoryKey == null) {  
  12.                                factoryKey = QUARTZ_FACTORY_KEY;  
  13.                       }  
  14.                       StdSchedulerFactory factory = (StdSchedulerFactory) event.getServletContext().getAttribute(factoryKey);  
  15.   
  16.                    try {  
  17.                          QuartzScheduleHolder.getInstance().setScheduler(factory.getScheduler());  
  18.                        //per 2 hours add friends  
  19.                        Trigger trigger =  TriggerUtils.makeHourlyTrigger(24);  
  20.                        //Trigger trigger =  TriggerUtils.makeSecondlyTrigger(60);  
  21.                        trigger.setName(AddNewUserFriendJobDetail.JOB_NAME);  
  22.                       trigger.setStartTime(this.getBeforeAfterDate(1,-13));  
  23.                       QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new AddNewUserFriendJobDetail(),trigger);  
  24.                       //把job和Trigger关联,这样当Trigger认为应该触发的时候就会调用(实际上是Scheduler调用)job.execute方法了。  
  25.   
  26.                       //per 3 day send mail and leave message  
  27.                       Trigger trigger2 =  TriggerUtils.makeHourlyTrigger(24*3);  
  28.                       trigger2.setStartTime(this.getBeforeAfterDate(1,-12));  
  29.                       trigger2.setName(LeaveMessageNewUserJobDetail.JOB_NAME);  
  30.                       QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new LeaveMessageNewUserJobDetail(),trigger2);  
  31.   
  32.                        // per 6  recommend video  
  33.                       Trigger trigger3 =  TriggerUtils.makeHourlyTrigger(24*7);  
  34.                       trigger3.setName(RecommendVideoNewUserJobDetail.JOB_NAME);  
  35.                       trigger3.setStartTime(this.getBeforeAfterDate(2,-11));  
  36.                       QuartzScheduleHolder.getInstance().getScheduler().scheduleJob(new RecommendVideoNewUserJobDetail(),trigger3);  
  37.   
  38.               
  39.                          QuartzScheduleHolder.getInstance().getScheduler().start();  
  40.                    } catch (Exception e) {  
  41.                         e.printStackTrace();  
  42.                    }  
  43.               }  
  44.   
  45.              public void contextDestroyed(ServletContextEvent event) {  
  46.                    super.contextDestroyed(event);  
  47.                      QuartzScheduleHolder.getInstance().setScheduler(null);  
  48.              }  
  49.   
  50.               private Date getBeforeAfterDate( int day,int hour){  
  51.                        Calendar   cal   =   Calendar.getInstance();  
  52.                       cal.add(Calendar.DATE,day);  
  53.                      cal.add(Calendar.HOUR,hour);  
  54.                      return cal.getTime();   
  55.              }  
  56.            }  
  57. 二。Spring Quartz  
  58.       Spring的scheduling。quartz包中对Quartz的框架进行封装,使得开发时不用写任何Quartz和Spring的代码就可以实现定时任务。Spring通过JobDetailBean,MethodInvokingJobDetailFactoryBean实现Job的定义,后者更加使用,只需指定要运行的类,和该类中运行的方法即可,Spring将自动生成符合Quartz要求的JobDetail。例如:  
  59.       1.jobDetail   
  60.          public class SayHelloJob {  
  61.       
  62.                    private static  DateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  63.   
  64.                    private String message;  
  65.   
  66.                    public String getMessage() {  
  67.                            return message;  
  68.                   }  
  69.   
  70.                   public void setMessage(String message) {  
  71.                             this.message = message;  
  72.                  }  
  73.   
  74.                  public void sayHello(){  
  75.                           Date date = new Date();  
  76.                          System.out.println(dateFormat.format(date)+" :"+this.getMessage() );  
  77.                  }  
  78.           }  
  79.        2.spring的配置文件:quartzbean.xml  
  80.            <?xml version="1.0" encoding="UTF-8"?>  
  81.   
  82.            <beans xmlns="http://www.springframework.org/schema/beans"  
  83.                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  84.                     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  85.   
  86.                     <bean name="sayHelloJob" class="com.fg114.takeout.job.SayHelloJob">  
  87.                               <property name="message" value="start .............." />  
  88.                    </bean>  
  89.   
  90.                    <bean name="sayHelloDetailBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  91.                               <property name="targetObject" ref="sayHelloJob" />  
  92.                              <property name="targetMethod" value="sayHello"/>  
  93.                     </bean>  
  94.   
  95.                    <bean name="simpleTriggerBean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
  96.                                   <!--这里定义定时任务的对象的位置-->  
  97.                             <property name="jobDetail" ref="sayHelloDetailBean"/>  
  98.                            <!--这里定义每六秒钟程序执行一次-->  
  99.                              <property name=""></property>  
  100.                             <property name="repeatInterval" value="6000"/>  
  101.                            <!--这里定义程序启动两秒钟后开始执行-->  
  102.                          <property name="startDelay" value="2000"/>  
  103.                     </bean>  
  104.                  <! --          启动任务    -->  
  105.                    <bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  106.                          <property name="triggers">  
  107.                              <list>  
  108.                                   <ref bean="simpleTriggerBean"/>  
  109.                             </list>  
  110.                        </property>  
  111.                   </bean>  
  112.              </beans>  
  113. 3.web.xml :  
  114.             加入  
  115.            <listener>  
  116.              <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  117.            </listener>  
  118.        注意:common-collections.jar 版本布不能是2.1版本的  




相关Jar:
   quartz-1.8.6.jar
   jta.jar
   commons-logging-1.1.jar
   commons-collections3.2.jar

Maven
Maven artifacts should now be available in the central Maven repository within a few hours after a new release.

The group id is: org.quartz-scheduler. Substitute the version number you wish to use in the dependency snippets below (e.g. "1.8.6", "2.0.2", etc.)
Java代码  收藏代码
  1. <dependency>  
  2.     <groupId>org.quartz-scheduler</groupId>  
  3.     <artifactId>quartz</artifactId>  
  4.     <version>2.1.5</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>org.quartz-scheduler</groupId>  
  8.     <artifactId>quartz-oracle</artifactId>  
  9.     <version>2.1.5</version>  
  10. </dependency>  
  11. <dependency>  
  12.     <groupId>org.quartz-scheduler</groupId>  
  13.     <artifactId>quartz-weblogic</artifactId>  
  14.     <version>2.1.5</version>  
  15. </dependency>  
  16. <dependency>  
  17.     <groupId>org.quartz-scheduler</groupId>  
  18.     <artifactId>quartz-jboss</artifactId>  
  19.     <version>2.1.5</version>  
  20. </dependency>  


Java代码  收藏代码
  1. /** 
  2.  * 版权所有:华信软件 
  3.  * 项目名称:公用模块 
  4.  * 创建者: Wangdf 
  5.  * 创建日期: 2011-1-22 
  6.  * 文件说明: 定时任务管理类 
  7.  * 最近修改者:Wangdf 
  8.  * 最近修改日期:2011-1-22 
  9.  */  
  10. package com.extjweb.quartz;  
  11.   
  12. import java.text.ParseException;  
  13.   
  14. import org.quartz.CronTrigger;  
  15. import org.quartz.JobDetail;  
  16. import org.quartz.Scheduler;  
  17. import org.quartz.SchedulerException;  
  18. import org.quartz.SchedulerFactory;  
  19. import org.quartz.impl.StdSchedulerFactory;  
  20.   
  21. /** 
  22.  * 定时任务管理类 
  23.  * 
  24.  * @author 王德封 
  25.  */  
  26. public class QuartzManager {  
  27.     private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();  
  28.     private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";  
  29.     private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";  
  30.   
  31.     /** 
  32.      * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 
  33.      * 
  34.      * @param jobName 
  35.      *            任务名 
  36.      * @param jobClass 
  37.      *            任务 
  38.      * @param time 
  39.      *            时间设置,参考quartz说明文档 
  40.      * @throws SchedulerException 
  41.      * @throws ParseException 
  42.      */  
  43.     public static void addJob(String jobName, String jobClass, String time) {  
  44.         try {  
  45.             Scheduler sched = gSchedulerFactory.getScheduler();  
  46.             JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, Class.forName(jobClass));// 任务名,任务组,任务执行类  
  47.             // 触发器  
  48.             CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组  
  49.             trigger.setCronExpression(time);// 触发器时间设定  
  50.             sched.scheduleJob(jobDetail, trigger);  
  51.             // 启动  
  52.             if (!sched.isShutdown()){  
  53.                 sched.start();  
  54.             }  
  55.         } catch (Exception e) {  
  56.             e.printStackTrace();  
  57.             throw new RuntimeException(e);  
  58.         }  
  59.     }  
  60.   
  61.     /** 
  62.      * 添加一个定时任务 
  63.      * 
  64.      * @param jobName 
  65.      *            任务名 
  66.      * @param jobGroupName 
  67.      *            任务组名 
  68.      * @param triggerName 
  69.      *            触发器名 
  70.      * @param triggerGroupName 
  71.      *            触发器组名 
  72.      * @param jobClass 
  73.      *            任务 
  74.      * @param time 
  75.      *            时间设置,参考quartz说明文档 
  76.      * @throws SchedulerException 
  77.      * @throws ParseException 
  78.      */  
  79.     public static void addJob(String jobName, String jobGroupName,  
  80.             String triggerName, String triggerGroupName, String jobClass, String time){  
  81.         try {  
  82.             Scheduler sched = gSchedulerFactory.getScheduler();  
  83.             JobDetail jobDetail = new JobDetail(jobName, jobGroupName, Class.forName(jobClass));// 任务名,任务组,任务执行类  
  84.             // 触发器  
  85.             CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组  
  86.             trigger.setCronExpression(time);// 触发器时间设定  
  87.             sched.scheduleJob(jobDetail, trigger);  
  88.         } catch (Exception e) {  
  89.             e.printStackTrace();  
  90.             throw new RuntimeException(e);  
  91.         }  
  92.     }  
  93.   
  94.     /** 
  95.      * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) 
  96.      * 
  97.      * @param jobName 
  98.      * @param time 
  99.      */  
  100.     public static void modifyJobTime(String jobName, String time) {  
  101.         try {  
  102.             Scheduler sched = gSchedulerFactory.getScheduler();  
  103.             CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName, TRIGGER_GROUP_NAME);  
  104.             if(trigger == null) {  
  105.                 return;  
  106.             }  
  107.             String oldTime = trigger.getCronExpression();  
  108.             if (!oldTime.equalsIgnoreCase(time)) {  
  109.                 JobDetail jobDetail = sched.getJobDetail(jobName, JOB_GROUP_NAME);  
  110.                 Class objJobClass = jobDetail.getJobClass();  
  111.                 String jobClass = objJobClass.getName();  
  112.                 removeJob(jobName);  
  113.   
  114.                 addJob(jobName, jobClass, time);  
  115.             }  
  116.         } catch (Exception e) {  
  117.             e.printStackTrace();  
  118.             throw new RuntimeException(e);  
  119.         }  
  120.     }  
  121.   
  122.     /** 
  123.      * 修改一个任务的触发时间 
  124.      * 
  125.      * @param triggerName 
  126.      * @param triggerGroupName 
  127.      * @param time 
  128.      */  
  129.     public static void modifyJobTime(String triggerName,  
  130.             String triggerGroupName, String time) {  
  131.         try {  
  132.             Scheduler sched = gSchedulerFactory.getScheduler();  
  133.             CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName, triggerGroupName);  
  134.             if(trigger == null) {  
  135.                 return;  
  136.             }  
  137.             String oldTime = trigger.getCronExpression();  
  138.             if (!oldTime.equalsIgnoreCase(time)) {  
  139.                 CronTrigger ct = (CronTrigger) trigger;  
  140.                 // 修改时间  
  141.                 ct.setCronExpression(time);  
  142.                 // 重启触发器  
  143.                 sched.resumeTrigger(triggerName, triggerGroupName);  
  144.             }  
  145.         } catch (Exception e) {  
  146.             e.printStackTrace();  
  147.             throw new RuntimeException(e);  
  148.         }  
  149.     }  
  150.   
  151.     /** 
  152.      * 移除一个任务(使用默认的任务组名,触发器名,触发器组名) 
  153.      * 
  154.      * @param jobName 
  155.      */  
  156.     public static void removeJob(String jobName) {  
  157.         try {  
  158.             Scheduler sched = gSchedulerFactory.getScheduler();  
  159.             sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器  
  160.             sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器  
  161.             sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务  
  162.         } catch (Exception e) {  
  163.             e.printStackTrace();  
  164.             throw new RuntimeException(e);  
  165.         }  
  166.     }  
  167.   
  168.     /** 
  169.      * 移除一个任务 
  170.      * 
  171.      * @param jobName 
  172.      * @param jobGroupName 
  173.      * @param triggerName 
  174.      * @param triggerGroupName 
  175.      */  
  176.     public static void removeJob(String jobName, String jobGroupName,  
  177.             String triggerName, String triggerGroupName) {  
  178.         try {  
  179.             Scheduler sched = gSchedulerFactory.getScheduler();  
  180.             sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器  
  181.             sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器  
  182.             sched.deleteJob(jobName, jobGroupName);// 删除任务  
  183.         } catch (Exception e) {  
  184.             e.printStackTrace();  
  185.             throw new RuntimeException(e);  
  186.         }  
  187.     }  
  188.   
  189.     /** 
  190.      * 启动所有定时任务 
  191.      */  
  192.     public static void startJobs() {  
  193.         try {  
  194.             Scheduler sched = gSchedulerFactory.getScheduler();  
  195.             sched.start();  
  196.         } catch (Exception e) {  
  197.             e.printStackTrace();  
  198.             throw new RuntimeException(e);  
  199.         }  
  200.     }  
  201.   
  202.     /** 
  203.      * 关闭所有定时任务 
  204.      */  
  205.     public static void shutdownJobs() {  
  206.         try {  
  207.             Scheduler sched = gSchedulerFactory.getScheduler();  
  208.             if(!sched.isShutdown()) {  
  209.                 sched.shutdown();  
  210.             }  
  211.         } catch (Exception e) {  
  212.             e.printStackTrace();  
  213.             throw new RuntimeException(e);  
  214.         }  
  215.     }  
  216. }  


Java代码  收藏代码
  1. // execute the job  
  2. try {  
  3.     log.debug("Calling execute on job " + jobDetail.getFullName());  
  4.     job.execute(jec);  
  5.   
  6.     // 2011/1/22 王德封 添加  
  7.     DBUtil.commit();  
  8.   
  9.     endTime = System.currentTimeMillis();  
  10. catch (JobExecutionException jee) {  
  11.     endTime = System.currentTimeMillis();  
  12.     jobExEx = jee;  
  13.   
  14.     // 2011/1/22 王德封 添加  
  15.     DBUtil.rollback();  
  16.   
  17.     getLog().info("Job " + jobDetail.getFullName() +  
  18.             " threw a JobExecutionException: ", jobExEx);  
  19. catch (Throwable e) {  
  20.     endTime = System.currentTimeMillis();  
  21.     getLog().error("Job " + jobDetail.getFullName() +  
  22.             " threw an unhandled Exception: ", e);  
  23.     SchedulerException se = new SchedulerException(  
  24.             "Job threw an unhandled exception.", e);  
  25.     se.setErrorCode(SchedulerException.ERR_JOB_EXECUTION_THREW_EXCEPTION);  
  26.     qs.notifySchedulerListenersError("Job ("  
  27.             + jec.getJobDetail().getFullName()  
  28.             + " threw an exception.", se);  
  29.     jobExEx = new JobExecutionException(se, false);  
  30.     jobExEx.setErrorCode(JobExecutionException.ERR_JOB_EXECUTION_THREW_EXCEPTION);  
  31.   
  32.     // 2011/1/22 王德封 添加  
  33.     DBUtil.rollback();  
  34. finally {  
  35.     // 2011/1/22 王德封 添加  
  36.     DBUtil.closeCurrentConnection();  
  37. }  


Java代码  收藏代码
  1. System.out.println("【系统启动】开始(每1秒输出一次)...");  
  2. QuartzManager.addJob(job_name, job, "0/1 * * * * ?");  
  3. //QuartzManager.addJob(job_name, job, "0 0/3 8-20 ? ? *");  
  4.   
  5. Thread.sleep(5000);  
  6. System.out.println("【修改时间】开始(每2秒输出一次)...");  
  7. QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");  
  8. Thread.sleep(6000);  
  9. System.out.println("【移除定时】开始...");  
  10. QuartzManager.removeJob(job_name);  
  11. System.out.println("【移除定时】成功");  
  12.   
  13. System.out.println("/n【再次添加定时任务】开始(每10秒输出一次)...");  
  14. QuartzManager.addJob(job_name, job, "*/10 * * * * ?");  
  15. Thread.sleep(60000);  
  16. System.out.println("【移除定时】开始...");  
  17. QuartzManager.removeJob(job_name);  
  18. System.out.println("【移除定时】成功");  


Java代码  收藏代码
  1. package com.extjweb.quartz;  
  2.   
  3. import java.util.Calendar;  
  4.   
  5. import org.quartz.Job;  
  6. import org.quartz.JobExecutionContext;  
  7. import org.quartz.JobExecutionException;  
  8.   
  9. public class TestJob implements Job {  
  10.   
  11.     @SuppressWarnings("deprecation")  
  12.     public void execute(JobExecutionContext arg0) throws JobExecutionException {  
  13.         System.out.println(Calendar.getInstance().getTime().toLocaleString()+ "★★★★★★★★★★★");  
  14.     }  
  15.   
  16. }  


quartz 时间配置规则
格式: [秒] [分] [小时] [日] [月] [周] [年]

序号 说明
是否必填 允许填写的值 允许的通配符
1 秒 是 0-59   , - * /
2 分 是 0-59
  , - * /
3 小时 是 0-23   , - * /
4 日 是 1-31   , - * ? / L W
5 月 是 1-12 or JAN-DEC   , - * /
6 周 是 1-7 or SUN-SAT   , - * ? / L #
7 年 否 empty 或 1970-2099 , - * /
通配符说明:
* 表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
- 表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。
, 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发
/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。
L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"
W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-").
小提示
'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发(一般指发工资 )

# 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)
小提示
周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.
      
常用示例:

0 0 12 * * ? 每天12点触发
0 15 10 ? * * 每天10点15分触发
0 15 10 * * ? 每天10点15分触发
0 15 10 * * ? * 每天10点15分触发
0 15 10 * * ? 2005 2005年每天10点15分触发
0 * 14 * * ? 每天下午的 2点到2点59分每分触发
0 0/5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0/5 14,18 * * ?


每天下午的 2点到2点59分(整点开始,每隔5分触发)
每天下午的 18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ? 每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED 3月分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI 从周一到周五每天上午的10点15分触发
0 15 10 15 * ? 每月15号上午10点15分触发
0 15 10 L * ? 每月最后一天的10点15分触发
0 15 10 ? * 6L 每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005 从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3 每月的第三周的星期五开始触发
0 0 12 1/5 * ? 每月的第一个中午开始每隔5天触发一次

0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)


转载自

http://lgscofield.iteye.com/blog/1593036#bc2320837

内容概要:本文提出了一种面向通信优化的微电网分布式二次电压频率调控与功率均分方法,结合Simulink仿真实现,旨在解决微电网中电压频率恢复与有功/无功功率精确分配的关键问题。通过引入混合动态事件触发机制,在确保控制精度的同时显著降低通信频率,有效缓解通信资源紧张问题,提升系统实时性与运行效率。该方法采用完全分布式的协同控制架构,摆脱对中央控制器的依赖,避免单点故障风险,增强系统的鲁棒性与可扩展性。仿真模型构建了包含多个分布式发电单元(DG)的微电网系统,详细模拟其动态响应过程,验证了所提策略在不同负载扰动、通信延迟及网络拓扑变化等复杂工况下的有效性,成功实现了电压频率的快速无静差恢复与功率的精确均分,兼顾了控制性能与通信成本的双重优化。; 适合人群:具备电力系统、自动控制理论或新能源并网技术等相关专业背景,熟悉Matlab/Simulink仿真环境,从事微电网控制、分布式能源系统、智能配电网或电力电子控制等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①作为微电网二次控制算法的教学案例与科研仿真平台;②为分布式能源系统的电压频率稳定控制与功率均衡分配提供先进的算法设计与性能验证方案;③支持对事件触发控制、通信优化策略在实际电力系统中的应用效果进行评估、改进与推广。; 阅读建议:建议结合提供的Simulink模型与配套代码进行动手实践,重点剖析控制器的设计逻辑、事件触发条件的设定原则以及通信机制的实现方式,通过主动修改负载参数、调整通信拓扑结构等方式,深入探究系统在不同运行条件下的动态特性与鲁棒性表现。
当前位置:首页 所有数据 企业数据 正文 600多家商业银行数据大全 2007-2024年 zh899_mary 2026-04-22 其他数据 3.74k 01、数据介绍 数据包括全国600多家银行数据,包括上市银行和非上市银行基本信息,资产负债、利润、财务指标、现金流量表、流动性风险、市场风险、信用风险、存款结构等数据表。 数据名称:600多家商业银行数据大全 数据年份:2007-2024年 02、数据指标 银行代码 银行中文简称 统计截止日期 报表类型 股票代码 存款总额 公司存款 公司定期存款 公司活期存款 个人存款 个人定期存款 个人活期存款 保证金存款 公司存款占比 公司定期存款占比 公司活期存款占比 个人存款占比 个人定期存款占比 个人活期存款占比 保证金存款占比 银行代码 股票代码 统计截止日期 银行中文简称 核心一级资本 核心一级资本扣除项目 核心一级资本净额 附属资本净额 其他一级资本 一级资本净额 二级资本 其中:享受优惠政策可计入部分 二级资本扣除项目 二级资本净额 资本净额 信用风险加权资产 市场风险加权资产 操作风险加权资产 其他 风险加权资产合计 资本充足率 一级资本充足率 核心资本充足率 加权风险资产收益率 风险加权资产对总资产比率 风险加权资产对生息资产比率 风险加权资产对总贷款比率 穆迪评级-中国主权 穆迪评级-银行 穆迪评级展望 标准普尔评级-中国主权 标准普尔评级-银行 标准普尔评级展望 惠誉评级-中国主权 惠誉评级-银行 惠誉评级展望 银行代码 股票代码 统计截止日期 银行中文简称 利率风险敏感度 累计外汇头寸敞口比例 风险资本利润率 杠杆率 资产利润率 资本利润率 成本收入比例 银行代码 股票代码 统计截止日期 银行中文简称 流动性比例(本币) 流动性比例(外币) 流动性比例(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值