EjB-定时器

前提


因为当我们借书时间超过预定的时间这个时候就要给大家发邮件,所以必须设定一个定时器去做这件事。因为用的是Ejb框架,所以这个时候我们利用jboss容器可以帮助我们做到。当容器启动则定时器跟随启动,当容器停止,则定时器跟随停止。好处还不止如此。jboss容器还帮助我们把事物出错的回滚也帮助我们做到。所以好好大大的。Ejb实现定时有两种方式:下面是思维导图介绍


宏观


Ejb实现定时有两种方式,一种是需要触发,另一种是容器启动则定时器启动。他可以周期性的执行,也可以到点就执行。这次根据需求项目上使用的是自动触发定时器(容器启动则定时器启动)
这里写图片描述


具体代码


如何要定时并且发送邮件。必须满足一下几个条件才可以发送邮件
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();
           //3表示超期
           if(getIsOverdue==3) {
               //返回true则表示该书超期,需要发送邮件
               List<TStudent> tStudents = studentService.getStudentBystudentCode(code);
               sendMaill.sendMail(tStudents.get(0).getEmail(),"18333640045@163.com");
           }
           return  true;
        }
        return false;
    }

查看是否到还书时间,是否超出时间更新借阅状态

  /*-
     *王雪芬-2018年4月29日17:59:23
     * 1查询所有的借书情况
     * 2判断当前借书是否超过预期还书情况
     * 3如果超期则标记已经超期
     * @param isbn
     * @param code
     * @return
     */

    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类型,用于与当前时间long类型进行比较
        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();
          }
   }
        //查看是否预期时间比结束时间相差1天
         long  between = Enddate-borrowtime;
            //相差1天则返回true,需要发送邮件
            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);

成果展示


大家记得借了书要换哦,因为我的定时器会到点就去检查你们的,嘿嘿。
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王雪芬-ghqr-264962

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值