因为当我们借书时间超过预定的时间这个时候就要给大家发邮件,所以必须设定一个定时器去做这件事。因为用的是Ejb框架,所以这个时候我们利用jboss容器可以帮助我们做到。当容器启动则定时器跟随启动,当容器停止,则定时器跟随停止。好处还不止如此。jboss容器还帮助我们把事物出错的回滚也帮助我们做到。所以好好大大的。Ejb实现定时有两种方式:下面是思维导图介绍 |
Ejb实现定时有两种方式,一种是需要触发,另一种是容器启动则定时器启动。他可以周期性的执行,也可以到点就执行。这次根据需求项目上使用的是自动触发定时器(容器启动则定时器启动) ![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/c80483efa718f0ccd1172f6ec07cc1af.jpeg) |
如何要定时并且发送邮件。必须满足一下几个条件才可以发送邮件 0.查询所有未还书人员。 1. 是否超期 2. 结束时间是否要到预约还书时间 3. 如果借书时间超过预约时间更改数据库中借书的状态为超期状态 |
定时代码
@TransactionAttribute(TransactionAttributeType.NEVER)
@Schedule(second = "*/200", minute = "*", hour = "*", persistent = false)
public void printTime(){
List<TBorrowing> list= borrowingService.doTime();
if(list.size()>0){
for (int i = 0; i <list.size() ; i++) {
doWork( list.get(i).getIsbn(),list.get(i).getUserId());
}
}
}
执行下面的条件是符合 1. 是否超期 2. 结束时间是否要到预约还书时间 3. 如果借书时间超过预约时间更改数据库中借书的状态为超期状态 |
public void doWork(String isbn,String code ){
boolean flag = borrowingService.BorrowingTime(isbn,code);
if (flag =true){
boolean flag1= borrowingService.addAppBorrowingTime(isbn,code);
if(flag1=true){
List<TStudent> tStudents = studentService.getStudentBystudentCode(code);
sendMaill.sendMail(tStudents.get(0).getEmail(),"18333640045@163.com");
}
}
}
/**
* 查看该用户的isbn是否超期,如何超期则发送邮件-王雪芬-2018年4月29日17:59:23
* @param isbn
* @param code
* @return
*/
public boolean BorrowingTime(String isbn, String code) {
TypedQuery<TBorrowing> query = em.createNamedQuery("BorrowingTime",TBorrowing.class);
query.setParameter("isbn",isbn);
query.setParameter("code",code);
List<TBorrowing> BorrowingTime= query.getResultList();
if (BorrowingTime.size()>0){
int getIsOverdue= BorrowingTime.get(0).getIsOverdue();
if(getIsOverdue==3) {
List<TStudent> tStudents = studentService.getStudentBystudentCode(code);
sendMaill.sendMail(tStudents.get(0).getEmail(),"18333640045@163.com");
}
return true;
}
return false;
}
public boolean addAppBorrowingTime(String isbn, String code) {
TypedQuery<TBorrowing> query = em.createNamedQuery("addAppBorrowingTime",TBorrowing.class);
query.setParameter("isbn",isbn);
query.setParameter("code",code);
List<TBorrowing> BorrowingTime= query.getResultList();
long Enddate=BorrowingTime.get(0).getEndDate().getTime();
long borrowtime=BorrowingTime.get(0).getBorrowTime().getTime();
Date BorrowNow= new Date();
long newlong = BorrowNow.getTime();
if (Enddate<=newlong) {
if(BorrowingTime.get(0).getBorrowStatus()==1){
String sql = "UPDATE TBorrowing set borrow_status=3 where is_overdue=0 and isbn=:isbn and user_id=:codes and borrow_status=1 ";
Query query2 = em.createQuery(sql);
query2.setParameter("isbn", isbn)
.setParameter("codes", code);
query2.executeUpdate();
}
}
long between = Enddate-borrowtime;
if(between > (24* 3600000)){
return true;
}
else {
return false;
}
}
其实对于定时器我倒是没有感觉太难,难就是难在逻辑上面。只有逻辑弄好就没有问题。下面是我要执行数据库语句的时候出现了问题。报的是下面的错误。当我执行更新操作的使用就报错 |
jpql Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: t_borro
解决方案 使用createQuery必须使用的是类名TBorrowing ,不能使用表名,否则就会报mapping,就是找不到你要的表。 第一种执行原生sql语句 |
String sql = "UPDATE TBorrowing set borrow_status=3 where is_overdue=0 and isbn=:isbn and user_id=:codes and borrow_status=1 ";
Query query2 = em.createQuery(sql);
第二种执行原生sql语句,使用的是createNativeQuery,使用它的时候使用的是t_borrowing 表,而不是类名。 |
String sql = "UPDATE t_borrowing set borrow_status=3 where is_overdue=0 and isbn=:isbn and user_id=:codes and borrow_status=1 ";
Query query2 = em.createNativeQuery(sql);
大家记得借了书要换哦,因为我的定时器会到点就去检查你们的,嘿嘿。 ![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/c36a2a76b352deec59fc2581de4fc35e.jpeg) |