對於系統使用度較高的數據,客戶在查看時但願這些數據最好先出現,此時須要爲其添加排序規則。在進行排序時,使用次數成爲排序的依據。所以須要設置一個字段用來描述某種數據的使用次數,也就是所謂的使用頻度。
本系統中,商品數據是總體數據流的核心數據,爲商品數據添加頻度字段。
該字段的值默認爲0,每使用一次,將其值自增一。可是若是每次使用都修改該表的對應字段,操做量無疑是巨大的,而且還牽扯到數據庫操做的隔離級問題,須要防止併發帶來的錯誤操做。
系統中常常會出現此類任務,即須要修改某些數據的值,可是此數據並不須要具備很強的即時性。只須要在某一個特定時刻,將該值修改便可。
基於上述分析,須要一種機制保障,在特定時間點,將對應商品的使用次數修改成當前已使用的總次數便可。最終數據排序時,以該字段做爲排序依據便可。
上述問題須要完成兩個任務便可javascript
Spring提供了定時器任務,用於在規定時間執行對應的任務。html
1.定義定時做業任務Bean,及其做業任務對應的操做html5
/**
* 設備一數據插入(小時)
*/
public void insertHourService1(){
realmEbi = (RealmEbi) ApplicationContextUtil.getBean("realmEbi");
realmEbi.insertHour(RealmApplianceModel.sendData3);
}
複製代碼
2.將其配置爲Spring管理的Beanjava
<!-- 定義一個定時bean -->
<bean id="timerTask" class="org.sihai.soilmoni.soilrealm.web.SoilRealmAction">
</bean>
複製代碼
3.定義做業任務web
<!-- 設備二數據定時插入(天) -->
<bean id="jobTask4" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="timerTask"/>
<property name="targetMethod" value="insertDayService2"/>
</bean>
複製代碼
4.定義做業任務的執行時間週期redis
<bean id="doTime4" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobTask4"/>
<property name="cronExpression" value="0 59 23 * * ?"/>
</bean>
複製代碼
5.設置該任務加入定時任務spring
<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表達式.txtsql
設置執行週期爲每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.設置該任務的執行週期
庫存預警功能是對庫存商品數量進行報警的一種機制。當庫存商品數量高於或低於指定的預警數量時,產生報警信息。
報警信息能夠是以下方案之一
1.設置報警定時器任務,當庫存商品總數量低於最低值或高於最高值時,發送Email到倉庫管理員,進行預警報警。
2.設置庫存預警定時做業調度任務
3.測試定時做業是否成功
4.獲取引起預警信息的數據
對庫存明細數據進行分組統計求和,若是數量超出對應商品的庫存預警值,將該商品加入庫存預警信息
select
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的整合技術,配置JavaMail發送器爲Spring管理的Bean,實現Spring管理資源的機制。
1.配置Spring管理的JavaMail發送器對象
<?xml version="1.0" encoding="UTF-8"?>
<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基礎、html五、javaEE基礎、struts二、spring、redis、luncene、oracle
等,將可得到以上的優質視頻教程及源碼。