ssh项目实战----Spring计时器任务 Spring整合JavaMail(邮件发送)
一、常用數據頻度維護
對于系統使用度較高的數據,客戶在查看時希望這些數據最好先出現,此時需要為其添加排序規則。在進行排序時,使用次數成為排序的依據。因此需要設置一個字段用來描述某種數據的使用次數,也就是所謂的使用頻度。
本系統中,商品數據是整體數據流的核心數據,為商品數據添加頻度字段。
該字段的值默認為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.源碼
<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.獲取引發預警信息的數據
對庫存明細數據進行分組統計求和,如果數量超出對應商品的庫存預警值,將該商品加入庫存預警信息
gm.uuid,
gm.goodsName,
sum(sdm.now)>=gm.maxNum ,
sum(sdm.now)<=gm.minNum
from
tbl_detail_store sdm,
tbl_goods gm
where
sdm.goodsUuid = gm.uuid
group by
sdm.goodsUuid
復制代碼
5.獲取數據后判斷是否需要發送庫存預計信息
五、Spring整合JavaMail
Spring提供對JavaMail的整合技術,配置JavaMail發送器為Spring管理的Bean,實現Spring管理資源的機制。
1.配置Spring管理的JavaMail發送器對象
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<description>JavaMail的配置文件</description>
<!-- 加載mail.properties配置文件 -->
<context:property-placeholder location="classpath:mail.properties"/>
<!-- 簡單消息對象創建 -->
<bean id="mailMessage" class="org.springframework.mail.SimpleMailMessage">
<property name="from" value="${mail.from}"></property>
</bean>
<!-- 2.創建發送器 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.host}"></property>
<property name="username" value="${mail.username}"></property>
<property name="password" value="${mail.password}"></property>
<property name="defaultEncoding" value="UTF-8"></property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.debug">true</prop>
<prop key="mail.smtp.timeout">0</prop>
</props>
</property>
</bean>
</beans>
復制代碼
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等,將可獲得以上的優質視頻教程及源碼。
總結
以上是生活随笔為你收集整理的ssh项目实战----Spring计时器任务 Spring整合JavaMail(邮件发送)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sublime 光标由竖线变下横线
- 下一篇: nc用法【转】