spring配置quartz后怎么访问数据库

spring配置quartz后怎么访问数据库,第1张

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代码获取定时任务的运行状态等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9336076.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存