1.Sping项目定时任务实现方法
下面博客详细介绍了4中实现方法:
http://blog.youkuaiyun.com/puma_dong/article/details/38032487?utm_source=tuicool&utm_medium=referral
2.使用spring @Scheduled注解执行定时任务
参考博客:http://blog.youkuaiyun.com/sd4000784/article/details/7745947
注意使用问题:
<task:annotation-driven/>
没配置scheduler,spring默认只会开一个线程(实测为:Thread
name: pool-1-thread-1)。配置demo如下:
<task:executor id="executorSpring" pool-size="5" />
<task:scheduler id="schedulerSpring" pool-size="10" />
<task:annotation-driven executor="executorSpring"
scheduler="schedulerSpring" />
- spring的@Scheduled注解,需要写在实现上;
- 定时器的任务方法不能有返回值;
- 实现类上要有组件的注解@Component,@Service,@Repository等;主要目的告诉spring将其注册为组件,一般用@Component
3.quartz 实现定时任务包冲突问题
项目使用maven构建,shiro做权限控制,此时再使用quartz 做定时任务会出现jar包冲突问题如下:
shiro-quartz 目前最新版是1.4.0-RC2,仍然使用quartz 1.6,基于spring4.X 的项目使用quartz 2.3 ,故出现jar包冲突问题。
解决方法:
- 修改源码-重写shiro-quartz包(只有两个类)
- 项目隔离(将定时任务单独做一个项目)
第二种就不做介绍了,介绍第一种:(shiro升级quartz到2.1.6版本)详细参考下面博客:
http://nonobaba.iteye.com/blog/2312468
上面博客,最后在XML配置文件中有一点没写清楚(完整的配置文件添加内容如下):
<!-- 会话管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
</bean>
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler2">
<property name="sessionValidationInterval" value="1800000" />
<property name="sessionManager" ref="sessionManager" />
</bean>
通过sessionManager的层次结构,选择DefaultWebSessionManager。
4.使用技巧
可以在maven中央仓库查看最新版本:http://search.maven.org/
中央仓库速度有点慢的,可以使用阿里的仓库,maven settings.xml添加:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>