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