编程(Java-Spring)
Mar 3

新手在使用springmvc 的时候,经常会碰到类似于:
访问:http://localhost:8080/PES/course.do 的时候报错:(使用隐藏变量来指定)
<input type="hidden" id="act" value="save" />
[WARN ] http-8080-Processor24 2012-03-03 13:59:43,062 org.springframework.web.servlet.PageNotFound     - No request handling method with name 'list' in class [com.pes.controller.front.RoomController]
的错误。
http://localhost:8080/PES/course.do?act=save 却正常。(直接指定)
 其实是我们页面命名没有弄好导致的,html  识别以name 为主的
正确的应该为
<input type="hidden" name="act" value="save" />

Tags:
Oct 14

spring 可以通过多种方式配置事务,如果使用编程式的 hibernate的 TempleTranslate

如果捕获则需要显式回滚,没有捕获,spring将自动处理

一般情况下,我们不需要对service层的异常做什么处理,类似于事务回滚,spring也会帮我们做了。但是一旦我们自己需要catch一些异常,自己做了处理,也是可以的,但是。但是。我们不由得联想到,spring还会捕获到这些异常吗?万一捕获不到,事务回滚就不会执行,就会出现脏数据。。。。。这样的后果,心理感觉很猥琐啊!

而事实就是如此!你会发现,如果你自己捕获了异常,spring的自动事务回滚功 能消失了!

实例2
        public void delete(final Integer[]ids)throws Exception{
        transactionTemplate.execute(new TransactionCallback(){
            //接口方法
            public Object doInTransaction(TransactionStatus status) {
                try{
                    //业务逻辑
                    }
                }catch(Exception e){
                    status.setRollbackOnly();
                    e.printStackTrace();
                }
                return null;
            }
           
        });
 

Oct 11

Spring使用之:Quartz定时任务为什么会被阻塞

解决方法:

1.将JobDetail的concurrent属性配置为false。不允许任务并发执行。
2.任务执行时间较长时,查找根本问题。

url:http://wangrui.javaeye.com/blog/159061

Oct 11

1、SchedulerFactoryBean会自动启动。
当在spring文件中定义了多个SchedulerFactoryBean实例时,一定要小心,因为这些ScheduleFactoryBean自从load进程序里,就会自动启动。如果要手动控制,注意要将autoStartup属性设置为false。
2、SchedulerFactoryBean暴露的是Scheduler,而不是SchedulerFactoryBean。
SchedulerFactoryBean实现了FactoryBean接口,必须实现两个方法,一个是getObjectType,另外一个则是getObject;其中getObjectType定义了返回的类型应该为Scheduler,而getObject指定了返回的是其一个重要属性scheduler,这个scheduler就是我们要获得的调度。
 
若在配置文件里为SchedulerFactoryBean定义了id属性为"scheduler",则在程序里调用getBean时,需要注意getBean("scheduler")返回的是Scheduler对象
 
3、SchedulerFactoryBean中有两个很重要的属性,一个是scheduler,另外一个是schedulerFactoryClass,spring通过用schedulerFactoryClass做代理来产生调度,并把它赋给scheduler。
private Class schedulerFactoryClass = StdSchedulerFactory.class;
//如果你没有指定schedulerFactoryClass ,那么它用的是quartz中自带的调度工厂,
this.scheduler = createScheduler(schedulerFactory, this.schedulerName);
//这里的schedulerName默认传进来是空的,其实如果你不是用自己定义的schedulerFactoryClass
//恐怕也没有什么意义,因为createScheduler是这样调用的
return schedulerFactory.getScheduler();
//显然schedulerName并没有用到,除非是你自行写一个schedulerFactory,并做好相应处理,
//否则返回的这个scheduler一定是一个指定名称的调度
Scheduler sched = schedRep.lookup(getSchedulerName());
//这个sched就是要代理生成的scheduler,getSchedulerName只有一句话,如下:
cfg.getStringProperty(PROP_SCHED_INSTANCE_NAME,"QuartzScheduler");
//如果我们没有使用一些特殊的机制,那么返回的只能是一个固定的字符串。
 
如上说述,如果我们希望不进行改造,就在spring的配置文件中定义多个调度的方法来实现我们个性化的任务安排时,可能并不可行。因为spring配置的scheduler只能有一个,即使你定义了多个调度,那么其实实现的只有一个,只是所有你希望指向不同调度的id都会指向它罢了,而这个调度会包含了其它所有调度中的任务。
 
4、抱错:org.quartz.SchedulerException: Repeat Interval cannot be zero
场景:该错误通常是在引用了SimpleTriggerBean的时候没有为repeatCount和repeatInterval赋值发生的,很奇怪,SimpleTriggerBean有一个空构造函数,在里面直接为repeatCount赋了一个REPEAT_INDEFINITELY,这样,当其进入validate函数时,会抱错。而quartz中的SimpleTrigger这两个属性默认值均为0,不懂spring中为何这样处理。
5、quartz和crontab的区别
a、quartz属于用户级别,crontab则属于系统级别;
b、quartz调度的线程,所有线程共享一个jvm;crontab调度的则是应用,每个应用都独立的占用资源。
6、quartz中加入并发多线程分析
a、quartz本身是有线程池支持的,这个可以用org.quartz.threadPool.threadCount属性来设置线程池大小,quartz的任务可以由quartz的线程池自动调度
b、对每个任务也可能起多线程,但是需要对并发数量做控制,可以考虑使用commons-pools提供的对象池机制

FROM:http://cuiyingfeng.blog.51cto.com/43841/59734

Oct 11

Quartz框架提供了丰富的任务调度支持,比如,在何时执行何种任务,它是一个开源的由OpenSymphony维护的项目,开发者能够在Java EE,或单独的Java SE应用中使用它。无论是简单的任务调度,还是复杂的企业级应用,Quartz都能够很好地胜任。其中,这些任务可以是普通POJO,甚至还可以是EJB 3.0组件。
如果开发者需要开发如下方面的应用,则Quartz是理想的选择。
◆驱动工作流:比如,如果新创建的流程任务需要在2小时内处理完,则在2小时后Quartz会检查订单是否成功处理。如果没有处理,则Quartz会依据工作流定义的规则来对订单进行处理,销毁它,或者进行其他处理。
◆系统维护工作:比如,在每个工作日的固定时间将RDBMS中的内容导出为XML文件。
       Spring 2.0提供了org.springframework.scheduling.quartz包,以支持Quartz任务调度集成。为提供用户的任务,开发者实现的类必须继承于quartz.QuartzJobBean抽象类。QuartzJobBean是Quartz中org.quartz.Job接口的简单实现(子类),Spring为简化Job接口的实现而提供了QuartzJobBean类。QuartzJobBean同Java 2 SDK中的TimerTask类似,用于定义任务本身。其中,executeInternal()方法定义待执行的任务,这同TimerTask中的 run()类似。
       为了指定更复杂的任务调度规则,开发者要使用Spring提供的CronTriggerBean,它是Quartz中 org.quartz.CronTrigger的子类,Spring 2.0为简化CronTrigger子类的开发而提供了CronTriggerBean。CronTriggerBean比 SimpleTriggerBean功能更强大,它能够控制任务执行的精确时间,比如,早上九点半需要执行某QuartzJobBean中给定的任务。借助于CronTriggerBean中的cronExpression属性能够设定任务的执行时机。
       Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在Spring中怎样配置Quartz:首先我们来写二个被调度的类QuartzJob,及QuartzJobTwo,二个以上类似:
package com.writchie.quartz;
public class QuartzJob
{
     public void work()
     {
             System.out.println("吴理琪提示您:Spring Quartz的任务调度1被调用!");
             //定时调用的业务逻辑
     }
}

package com.writchie.quartz;
public class QuartzJobTwo
{
     public void work()
     {
           System.out.println("吴理琪提示您:Spring Quartz的任务调度2被调用 !");
           //定时调用的业务逻辑
     }
}

Spring的配置文件applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns=" http://www.springframework.org/schema/beans "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd ">
         <!-- 要调用的工作类 -->
         <bean id="quartzJob" class="com.writchie.quartz.QuartzJob"></bean>
         <bean id="quartzJobTwo" class="com.writchie.quartz.QuartzJobTwo"></bean>
         <!-- 可继续加新的任务   -->
         <!-- 要调用的工作类结束 -->

         <!-- 定义调用对象和调用对象的方法 -->
         <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
             <!-- 调用的类 -->
             <property name="targetObject">
                 <ref bean="quartzJob"/>
             </property>
             <!-- 调用类中的方法 -->
             <property name="targetMethod">
                 <value>work</value>
             </property>
         </bean>

         <bean id="jobtask2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
             <!-- 调用的类 -->
             <property name="targetObject">
                 <ref bean="quartzJobTwo"/>
             </property>
             <!-- 调用类中的方法 -->
             <property name="targetMethod">
                 <value>work</value>
             </property>
         </bean>
         <!-- 可继续加新的   -->
       <!-- 定义调用对象和调用对象的方法结束 -->

         <!-- 定义触发时间 -->
         <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
             <property name="jobDetail">
                 <ref bean="jobtask"/>
             </property>
             <!-- cron表达式 此处定义为一直触发执行任务 -->
             <property name="cronExpression">
                 <value>10,15,20,25,30,35,40,45,50,55 * * * * ?</value>
             </property>
         </bean>
         
         <bean id="doTime2" class="org.springframework.scheduling.quartz.CronTriggerBean">
             <property name="jobDetail">
                 <ref bean="jobtask2"/>
             </property>
             <!-- cron表达式   此处定义周一至周日的下午13:15触发-->
             <property name="cronExpression">
                 <value>0 15 13 ? * SUN-SAT</value>
             </property>
         </bean>
         <!-- 可继续加新的   -->
         <!-- 定义触发时间结束 -->

         <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序   -->
         <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
             <property name="triggers">
                 <list>
                     <ref bean="doTime"/>
                     <ref bean="doTime2"/>
                   <!-- 可继续加新的   -->

                 </list>
             </property>
         </bean>
       <!-- 总管理类结束   -->
</beans>

测试程序:
package com.writchie.quartz;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class QuartzService {
public static void main(String[] args) {
   System.out.println("测试任务调度开始...");
   ApplicationContext context = new ClassPathXmlApplicationContext(
     "applicationContext.xml");
   // 如果配置文件中将startQuertz bean的lazy-init设置为false 则不用实例化
   // context.getBean("startQuertz");
   System.out.print("测试任务调度结束!\n");
}
}

测试结果:
测试任务调度开始...
- Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
测试任务调度结束!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度1被调用!
吴理琪提示您:Spring Quartz的任务调度2被调用 !
吴理琪提示您:Spring Quartz的任务调度1被调用!

关于cron表达式(参考资料):
Cron 表达式包括以下 7 个字段:



小时
月内日期

周内日期
年(可选字段)
特殊字符
Cron 触发器利用一系列特殊字符,如下所示:

反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。
问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。
在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。
井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。
星号(*)字符是通配字符,表示该字段可以接受任何可能的值。
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * / 表达式意义
"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期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午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" 每月的第三个星期五上午10:15触发
每天早上6点
0 6 * * *
每两个小时
0 */2 * * *
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
1月1日早上4点
0 4 1 1 *

From:http://blog.csdn.net/hereyouare/archive/2009/12/14/5004992.aspx

分页: 1/3 第一页 1 2 3 下页 最后页 [ 显示模式: 摘要 | 列表 ]