
quartz定时任务配置:
class="orgschelingquartz"
其中:
配置对应的定时任务,可配置多个,名称要唯一,对应的是第二步中配置的
配置,由于要实现动态读取定时任务周期时间,所以我们要写一个类实现,类的内容如下:
publicclassextendsimplements{
privatestaticfinallong=1L;
privatesysParamServiceImpl;
privateStringkey;
publicvoidsetKey(Stringkey)
{
thiskey=key;
}
publicvoidsetSysParamServiceImpl(SysParamServiceImplsysParamServiceImpl)
{
thissysParamServiceImpl=sysParamServiceImpl;
setCronExpression(getCronExpressionFromDB());
}
privateStringgetCronExpressionFromDB()
{
if(StringUtilsisEmpty(key))
return"000/1";
SysParamsysParam=newSysParam();
try
{
sysParam=sysParamServiceImplgetNameByKey(key);
}
catch(Exceptione)
{
eprintStackTrace();
}
if(sysParam!=null&&!StringUtilsisEmpty(sysParamgetParamValue()))
returnsysParamgetParamValue();
return"000/1";
}
}
简单说明一下:key是用来查询数据库配置的CronExpression表达式的查询条件,SysParamServiceImpl是实现查询的类,这几个参数都要从spring配置的CronTriggerFactoryBean参数获取,注意,配置的时候,key值的配置要在SysParamServiceImpl的配置之前,否则报空指针
spring配置CronTriggerFactoryBean:
实现了CronTriggerFactoryBean之后,开始配置CronTriggerFactoryBean,现在配置的是InitCronTriggerFactoryBean:
id对应quartz定时任务配置的,参数有三个,第二个和第三个是InitCronTriggerFactoryBean设置内容需要的,第一个则是定时任务执行业务逻辑的类
ps:,这个要配置对应的bean,我的是
配置对应的定时任务执行业务方法的类:
class="orgspringframeworkschelingquartzJobDetailFactoryBean"
简单说明一下:配置的是你需要定时执行的类,下面配置的是定时执行类中需要用到的其他类,这是由于项目启动执行定时任务不能在定时任务类中实例化这些类,要配置才行。
对应的定时任务执行类:
publicclassInquiryQuartzextendsQuartzJobBean{
@Autowired
privateInquiryServiceImplinquiryServiceImpl;
@Override
protectedvoidexecuteInternal(JobExecutionContextarg0)throwsJobExecutionException
{
//实例化接口
inquiryServiceImpl=(InquiryServiceImpl)arg0getJobDetail()getJobDataMap()get("inquiryServiceImpl");
//执行业务方法
quartzStart();
}
publicvoidquartzStart(){
//业务方法
}
}
说明一下:必须要实现QuartzJobBean接口
至此,就可以完成可配置CronExpression表达式的定时任务了!1
怎么动态给targetMethod传参数,解答如下
mysql动态修改配置参数分两种:
会话session:只对当前会话产生影响,退出mysql后失效;
全局GLOBAL:对后面的连接都有效,不过在重启mysql后失效。
step:
用root账号登录mysql命令行;
查看参数配置情况:
show variables; #显示全部参数。
show variables like '%wait%'; #显示包含wait的参数。
show session varialbes; #显示会话参数
show global varialbes; #显示全局参数
set session wait_timeout=10; #当前会话生效。
set GLOBAL wait_timeout = 10; #全局生效。
如果想要永久修改参数,则同时在/etc/mycnf配置文件修改。
public class SpringWiredBean implements ApplicationContextAware {
private ApplicationContext context;
public void setApplicationContext(
orgspringframeworkcontextApplicationContext context)
throws BeansException {
thiscontext = context;
}
public void quartz() {
Map<String, Trigger> beans = context
getBeansOfType(orgquartzTriggerclass);
Set<String> set = beanskeySet();
for (String key : set) {
Trigger cronTrigger = beansget(key);
if (cronTrigger instanceof CronTrigger) {
CronTrigger _cronTrigger = (CronTrigger) cronTrigger;
} else if (cronTrigger instanceof SimpleTrigger) {
SimpleTrigger _cronTrigger = (SimpleTrigger) cronTrigger;
} else if (cronTrigger instanceof NthIncludedDayTrigger) {
NthIncludedDayTrigger _cronTrigger = (NthIncludedDayTrigger) cronTrigger;
}
}
}
}
系统框架使用的springmvc 。。。。
在controller层上做了拦截器,添加了自定义标签,使用了该标签则需要校验session是否过期,过期则跳转至登录页面,但是系统用到了shiro,请问在java代码中如何判断seesion已经过期
Subject currentUser = SecurityUtilsgetSubject();
Session session = currentUsergetSession();
//过期,则跳转登录页面重新登录
if () { //就是这里不知道如何写!!!!!!!!!!!!!!!!!!!!!
dosomething;。。。。
}
shiro配置如下:
<!-- 会话DAO -->
<bean id="sessionDAO" class="orgapacheshirosessionmgteisEnterpriseCacheSessionDAO">
<property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
<property name="sessionIdGenerator" ref="sessionIdGenerator"/>
</bean>
<!-- 会话验证调度器 -->
<bean id="sessionValidationScheduler" class="orgapacheshirosessionmgtquartzQuartzSessionValidationScheduler">
<property name="sessionValidationInterval" value="1800000"/>
<property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- 会话管理器 -->
<bean id="sessionManager" class="orgapacheshirowebsessionmgtDefaultWebSessionManager">
<property name="globalSessionTimeout" value="1800000"/><!-- 回话有效时间30分钟 -->
<property name="deleteInvalidSessions" value="true"/>
<property name="sessionValidationSchedulerEnabled" value="true"/>
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
<property name="sessionDAO" ref="sessionDAO"/>
<property name="sessionIdCookieEnabled" value="true"/>
<property name="sessionIdCookie" ref="sessionIdCookie"/>
</bean>
希望能帮到楼主, 谢谢
但是发现servlet在启动时hold在那里了,跟了一下代码,发现quartz jobstoreCMT默认是使用的oracle db的TM锁,而jobstoreTX使用的是java的逻辑锁,于是登录到db中,查了一下,发现一个insert quartz_simple_triggers的DML *** 作申请了Qaurtz_Locks的表锁,而接着start quartz scheduler时也会去申请这个表锁,但是前面的DML *** 作一直都没有commit,所有quartz scheduler start时就被锁在那里了。然后试着将non managed datasource和managed datasource配成同一个datasource启动ok没有问题,但是正是因为配了同一个datasource可能下一次从pool中拿的connection的oracle session还是拥有那个锁资源的,锁资源没有被先前的connection释放掉,因为事务没有提交,connection的逻辑close不会释放session拥有的资源。这样又回到了原点,白试了一把,后来仔细跟了一把程序,发现autocommit是false,也没有地方显著的提交,scheduleJob和unscheduleJob都会有这种情况,本来以为只有job执行的时候会用到managed datasource,这样看来很多对job信息的处理的地方都用到了managed datasource,但是为什么quartz不帮我们wrap起来提交呢,控制transaction的任务交给了我们自己或container,交给我们自己是指我们需要自己用JTA transaction封装这些 *** 作,交给container就需要把属性:
请采纳
如果你认可我的回答,敬请及时采纳,
~如果你认可我的回答,请及时点击采纳为满意回答按钮
~~手机提问的朋友在客户端右上角评价点满意即可。
~你的采纳是我前进的动力
~~O(∩_∩)O,记得好评和采纳,互相帮助
以上就是关于spring配置quartz后怎么访问数据库全部的内容,包括:spring配置quartz后怎么访问数据库、怎么动态给targetMethod传参数、spring中配置了quartz定时任务,怎么在后台用java代码获取定时任务的运行状态等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)