【struts2+hibernate+spring项目实战】Spring计时器任务 Spring整合JavaMail(邮件发送)(ssh)
一、常用數(shù)據(jù)頻度維護(hù)
對(duì)于系統(tǒng)使用度較高的數(shù)據(jù),客戶在查看時(shí)希望這些數(shù)據(jù)最好先出現(xiàn),此時(shí)需要為其添加排序規(guī)則。在進(jìn)行排序時(shí),使用次數(shù)成為排序的依據(jù)。因此需要設(shè)置一個(gè)字段用來描述某種數(shù)據(jù)的使用次數(shù),也就是所謂的使用頻度。
本系統(tǒng)中,商品數(shù)據(jù)是整體數(shù)據(jù)流的核心數(shù)據(jù),為商品數(shù)據(jù)添加頻度字段。
該字段的值默認(rèn)為0,每使用一次,將其值自增一。但是如果每次使用都修改該表的對(duì)應(yīng)字段,操作量無疑是巨大的,并且還牽扯到數(shù)據(jù)庫操作的隔離級(jí)問題,需要防止并發(fā)帶來的錯(cuò)誤操作。
系統(tǒng)中經(jīng)常會(huì)出現(xiàn)此類任務(wù),即需要修改某些數(shù)據(jù)的值,但是此數(shù)據(jù)并不需要具有很強(qiáng)的即時(shí)性。只需要在某一個(gè)特定時(shí)刻,將該值修改即可。
基于上述分析,需要一種機(jī)制保障,在特定時(shí)間點(diǎn),將對(duì)應(yīng)商品的使用次數(shù)修改為當(dāng)前已使用的總次數(shù)即可。最終數(shù)據(jù)排序時(shí),以該字段作為排序依據(jù)即可。
上述問題需要完成兩個(gè)任務(wù)即可
- 規(guī)定時(shí)間內(nèi)循環(huán)執(zhí)行某任務(wù)
- 執(zhí)行特殊的SQL語句,完成修改使用次數(shù)字段的任務(wù)
二、Spring定時(shí)作業(yè)調(diào)度
Spring提供了定時(shí)器任務(wù),用于在規(guī)定時(shí)間執(zhí)行對(duì)應(yīng)的任務(wù)。
1.定義定時(shí)作業(yè)任務(wù)Bean,及其作業(yè)任務(wù)對(duì)應(yīng)的操作
/** * 設(shè)備一數(shù)據(jù)插入(小時(shí))*/ public void insertHourService1(){realmEbi = (RealmEbi) ApplicationContextUtil.getBean("realmEbi");realmEbi.insertHour(RealmApplianceModel.sendData3); }2.將其配置為Spring管理的Bean
<!-- 定義一個(gè)定時(shí)bean --> <bean id="timerTask" class="org.sihai.soilmoni.soilrealm.web.SoilRealmAction"> </bean>3.定義作業(yè)任務(wù)
<!-- 設(shè)備二數(shù)據(jù)定時(shí)插入(天) --> <bean id="jobTask4" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="timerTask"/><property name="targetMethod" value="insertDayService2"/> </bean>4.定義作業(yè)任務(wù)的執(zhí)行時(shí)間周期
<bean id="doTime4" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="jobTask4"/><property name="cronExpression" value="0 59 23 * * ?"/> </bean>5.設(shè)置該任務(wù)加入定時(shí)任務(wù)
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="doTime"/><ref bean="doTime2"/><ref bean="doTime3"/><ref bean="doTime4"/></list></property> </bean>6.修改執(zhí)行的時(shí)間周期值,參看:資源/定時(shí)調(diào)度Quartz/Cron表達(dá)式.txt
設(shè)置執(zhí)行周期為每10秒一次 0/10 * * * * ? 每10秒一次 0/10 * * ? * * 每10秒一次7.源碼
<?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.xsd"> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="doTime"/><ref bean="doTime2"/><ref bean="doTime3"/><ref bean="doTime4"/></list></property></bean><!-- 作業(yè)任務(wù) --><bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="jobTask"/><property name="cronExpression" value="0 59 23 * * ?"/></bean><bean id="doTime2" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="jobTask2"/><property name="cronExpression" value="0 59 23 * * ?"/></bean><bean id="doTime3" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="jobTask3"/><property name="cronExpression" value="0 59 23 * * ?"/></bean><bean id="doTime4" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="jobTask4"/><property name="cronExpression" value="0 59 23 * * ?"/></bean><!-- 定義作業(yè)任務(wù) --><!-- 設(shè)備一數(shù)據(jù)定時(shí)插入(小時(shí)) --><bean id="jobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="timerTask"/><property name="targetMethod" value="insertHourService1"/></bean><!-- 設(shè)備二數(shù)據(jù)定時(shí)插入(小時(shí)) --><bean id="jobTask2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="timerTask"/><property name="targetMethod" value="insertHourService2"/></bean><!-- 設(shè)備一數(shù)據(jù)定時(shí)插入(天) --><bean id="jobTask3" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="timerTask"/><property name="targetMethod" value="insertDayService1"/></bean><!-- 設(shè)備二數(shù)據(jù)定時(shí)插入(天) --><bean id="jobTask4" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="timerTask"/><property name="targetMethod" value="insertDayService2"/></bean><!-- 定義一個(gè)定時(shí)bean --><bean id="timerTask" class="org.sihai.soilmoni.soilrealm.web.SoilRealmAction"></bean></beans>三、常用數(shù)據(jù)頻度維護(hù)
使用Spring數(shù)據(jù)頻度調(diào)度維護(hù),配置需改數(shù)據(jù)操作,完成商品使用量頻度維護(hù)
1.定義維護(hù)商品使用頻度的SQL語句,執(zhí)行并驗(yàn)證執(zhí)行效果
update tbl_goods g set g.useNum = (select count(odm.uuid) from tbl_detail_order odm where odm.goodsUuid = g.uuid)2.將上述任務(wù)轉(zhuǎn)化為定時(shí)任務(wù)方法
注入對(duì)應(yīng)的數(shù)據(jù)層Bean,并開啟事務(wù)
3.設(shè)置該任務(wù)的執(zhí)行周期
四、庫存預(yù)警功能
庫存預(yù)警功能是對(duì)庫存商品數(shù)量進(jìn)行報(bào)警的一種機(jī)制。當(dāng)庫存商品數(shù)量高于或低于指定的預(yù)警數(shù)量時(shí),產(chǎn)生報(bào)警信息。
報(bào)警信息可以是如下方案之一
- 發(fā)郵件
- 發(fā)短信
- 給手機(jī)發(fā)送消息
- 發(fā)出警報(bào)消息(ERP系統(tǒng)內(nèi)發(fā)送給主管:主管再將該任務(wù)派發(fā)到人員:實(shí)現(xiàn)方式ServletContext范圍內(nèi)的數(shù)據(jù)共享,創(chuàng)建集合(必須是多線程安全的)頁面設(shè)計(jì)定時(shí)器定時(shí)獲取該集合數(shù)據(jù),每隔一段時(shí)間發(fā)送AJAX請(qǐng)求,獲取預(yù)警信息
報(bào)警操作必須時(shí)刻監(jiān)控庫存商品的數(shù)量。如果到達(dá)報(bào)警臨界值,進(jìn)行指定方式的信息報(bào)警。此處使用Email形式進(jìn)行報(bào)警。
1.設(shè)置報(bào)警定時(shí)器任務(wù),當(dāng)庫存商品總數(shù)量低于最低值或高于最高值時(shí),發(fā)送Email到倉庫管理員,進(jìn)行預(yù)警報(bào)警。
2.設(shè)置庫存預(yù)警定時(shí)作業(yè)調(diào)度任務(wù)
3.測試定時(shí)作業(yè)是否成功
4.獲取引發(fā)預(yù)警信息的數(shù)據(jù)
對(duì)庫存明細(xì)數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì)求和,如果數(shù)量超出對(duì)應(yīng)商品的庫存預(yù)警值,將該商品加入庫存預(yù)警信息
5.獲取數(shù)據(jù)后判斷是否需要發(fā)送庫存預(yù)計(jì)信息
五、Spring整合JavaMail
Spring提供對(duì)JavaMail的整合技術(shù),配置JavaMail發(fā)送器為Spring管理的Bean,實(shí)現(xiàn)Spring管理資源的機(jī)制。
1.配置Spring管理的JavaMail發(fā)送器對(duì)象
2.設(shè)置發(fā)送郵件相關(guān)內(nèi)容
//spring整合javaMail需要注入:private SimpleMailMessage mailMessage;private JavaMailSender mailSender;public void setMailMessage(SimpleMailMessage mailMessage) {this.mailMessage = mailMessage;}public void setMailSender(JavaMailSender mailSender) {this.mailSender = mailSender;} public void saveOrUpdate(final User entity) { if(UtilFuns.isEmpty(entity.getId())){//判斷id是否有值//說明id沒有值,說明保存 entity.setState(1); //1代表可用String id = UUID.randomUUID().toString();entity.setId(id);entity.getUserinfo().setId(id);//設(shè)置初始密碼 需要將默認(rèn)的密碼加密后保存到數(shù)據(jù)庫entity.setPassword(Encrypt.md5(SysConstant.DEFAULT_PASS, entity.getUserName())); //final就是延長對(duì)象的生命周期,不然entity只能在saveOrUpdate中使用,使用完成后方法彈棧,而run方法內(nèi)就無法再使用之前定義好的entity。 //使用spring與javaMail實(shí)現(xiàn)新員工入職時(shí)郵件的發(fā)送 //使用線程并try-catch的目的就是如果郵件發(fā)送失敗,也不影響信息保存到數(shù)據(jù)庫。郵件發(fā)送成為了一個(gè)獨(dú)立的過程。Thread th = new Thread(new Runnable(){public void run(){try {mailMessage.setTo(entity.getUserinfo().getEmail());mailMessage.setSubject("新員工入職信息");mailMessage.setText("歡迎"+entity.getUserinfo().getName()+"加入廊坊思創(chuàng)志遠(yuǎn)科技有限公司,您在公司的賬號(hào):"+entity.getUserName()+",密碼:"+SysConstant.DEFAULT_PASS);mailSender.send(mailMessage);} catch (MailException e) {e.printStackTrace();}}});th.start();}baseDao.saveOrUpdate(entity);}3.設(shè)置發(fā)送郵件的消息內(nèi)容
4.發(fā)送郵件
如果想獲取更多源碼或者視頻教程,歡迎關(guān)注我的微信公眾號(hào) 好好學(xué)java,在公眾號(hào)里,回復(fù):java基礎(chǔ)、html5、javaEE基礎(chǔ)、struts2、spring、redis、luncene、oracle等,將可獲得以上的優(yōu)質(zhì)視頻教程及源碼。
總結(jié)
以上是生活随笔為你收集整理的【struts2+hibernate+spring项目实战】Spring计时器任务 Spring整合JavaMail(邮件发送)(ssh)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【struts2+hibernate+s
- 下一篇: Java 技术之动态代理机制