发表于: 2017-12-15 21:23:11

1 574


今天完成的事:

       学习了Quartz定时任务。

maven导包,剔除了他的slf4j依赖,我自己导了

<dependency>
 <groupId>org.quartz-scheduler</groupId>
 <artifactId>quartz</artifactId>
 <version>${quartz.version}</version>
 <exclusions>
   <exclusion>
     <artifactId>slf4j-api</artifactId>
     <groupId>org.slf4j</groupId>
   </exclusion>
   <exclusion>
     <artifactId>slf4j-api</artifactId>
     <groupId>org.slf4j</groupId>
   </exclusion>
 </exclusions>
</dependency>

配置spring

<bean id="taskJob" class="quartz.DataConversionTask"/>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
   <property name="group" value="job_work"/>
   <property name="name" value="job_work_name"/>
   <!--false表示等上一个任务执行完后再开启新的任务-->
   <property name="concurrent" value="false"/>
   <property name="targetObject">
       <ref bean="taskJob"/>
   </property>
   <property name="targetMethod">
       <value>run</value>
   </property>
</bean>
<!--  调度触发器 -->
<bean id="myTrigger"
     class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
   <property name="name" value="work_default_name"/>
   <property name="group" value="work_default"/>
   <property name="jobDetail">
       <ref bean="jobDetail" />
   </property>
   <property name="cronExpression">
       <value>0/5 * * * * ?</value>
   </property>
</bean>

<!-- 调度工厂 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
   <property name="triggers">
       <list>
           <ref bean="myTrigger"/>
       </list>
   </property>
</bean>


启动项就不贴了,直接上结果。

明天计划的事:

       继续学习

问题:

收获:

      spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错。

Ø  详细说明

1.   一个cron表达式有至少6个(或7个)由空格分隔的时间元素,按顺序依次为:[秒] [分] [小时] [日] [月] [周] [年]

元素    必填        取值范围                通配符

秒     是          0~59                    , - * /

分     是          0~59                    , - * /

时      是          0~23                    , - * /

日     是          1~31                    , - * ? / L W

月     是          0-11 or JAN-DEC         , - * /

周     是           1-7 or SUN-SAT          , - * ? / L #

年     否           empty or 1970-2099      , - * /

其中,周取值:1=周日~7=周六,1=SUN,2=MON,3=TUE,4=WED,5=THU,6=FRI,7=SAT。

 

2.   通配符说明:

1)   * 表示所有值,例如:分设置为"*",表示每一分钟都会触发。

2)   ? 表示不指定值,使用场景不需要关心当前的这个元素。例如:要在每月的10号触发一个操作,但不关心是周几,所以周设置为"?",具体设置为 0 0 0 10 * ?。

3)   - 表示区间,例如:在小时上设置"10-12",表示10,11,12点都会触发。

4)   , 表示指定多个值(列表),例如:在周字段上设置"MON,WED,FRI",表示周一、周三、周五都会触发。

5)   / 用于递增触发,例如:在秒上面设置"5/15",表示从5秒开始,每增15秒触发一次(5,20,35,50)。

6)   L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]);在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如:在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五”。

7)   W 表示离指定日期的最近那个工作日(周一至周五)。例如:在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发,如果15号是周未,则找最近的下周一(16号)触发。如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为"1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注:"W"前只能设置具体的数字,不允许区间"-")。

8)   # 序号,表示每月的第几个周几。例如:在周字段上设置"6#3"表示在每月的第三个周六。注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了);小提示:'L'和'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发;周字段的设置,若使用英文字母是不区分大小写的,即MON与mon相同。

 

3.   常用示例:

0 0 12 * * ?            每天12点触发

0 15 10 ? * *           每天10点15分触发

0 15 10 * * ?           每天10点15分触发

0 15 10 * * ? *         每天10点15分触发

0 0 12 ? * WED          每周三12点触发

0 0/30 9-17 * * ?       每天九点到十五店,每半小时触发

0 10,14,16 * * ?        每天上午10点,下午2点、4点触发

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分、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分触发(光棍节)




log4j中log.isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled()作用

项目在应用log4j打印Debug,Info和Trace级别的log时需要加上对应的三个方法进行过滤,代码如下:

if (log.isDebugEnabled()) {

    log.debug(" From: " + req.getFrom().toString() + 

                  " To: " + req.getTo().toString() + 

                  " CallId: " + req.getCallId() + 

                  " msg:" + msg);

}

其作用是因为Debug,Info和Trace一般会打印比较详细的信息,而且打印的次数较多,如果我们不加log.isDebugEnabled()等

进行预先判断,当系统loglevel设置高于Debug或Info或Trace时,虽然系统不会答应出这些级别的日志,但是每次还是会拼接

参数字符串,影响系统的性能。

2.错误的优化方法

部分编码人员因为不了解机制,从代码复用性和简洁性而言定义如下函数来封装

    private void debug(String msg) {

        if (log.isDebugEnabled()) {

            log.debug(msg);

        }

}

其实这种封装方式是错误的,因为当系统中调用debug(msg)函数还是出现字符串的拼接





返回列表 返回列表
评论

    分享到