发表于: 2017-12-13 23:33:35

1 641


今天完成的事情:

1.完成昨天说的定时更新并保持access_token

web.xml中配置一个initServlet,不用servlet-mapping,因为我们不需要它处理任何请求

<servlet>
 <servlet-name>initServlet</servlet-name>
 <servlet-class>
   com.ptteng.academy.liver.util.wx.InitServlet
 </servlet-class>
 <load-on-startup>0</load-on-startup>
</servlet>


继承HttpServlet的initServlet,每当服务器启动时,就会运行这个类

public class InitServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;

   public void init()throws ServletException {
             new Thread(new TokenThread()).start();
   }
}


定时更新access_token的TokenThread类,也就是每次服务器启动时用initServlet启动的进程

逻辑:每隔7000秒更新一次access_token,并将其保持在类中的静态变量中,若获取access_token出现异常,则30秒后再循环一次,再次获取access_token,其他类可以通过TokenThread.accessToken获取access_token

public class TokenThread implements Runnable {
   private static Logger logger = Logger.getLogger(TokenThread.class);
   public static String accessToken = null;

   @Override
   public void run() {
       while (true) {
           try {
               accessToken = WeChatUtil.getAccessToken();
               if (null != accessToken) {
                   Thread.sleep(7000 * 1000);

               } else {
                   Thread.sleep(30 * 1000);
               }
           } catch (IOException e) {
               e.printStackTrace();
           } catch (InterruptedException e) {
               try {
                   Thread.sleep(30 * 1000);
               } catch (InterruptedException e1) {
                   e1.printStackTrace();
               }
               e.printStackTrace();
           }

       }

   }
}


使用下面写的测试工具测试是否能正确获取access_token,以及access_token的更新时间改为2分钟更新一次,而每1分钟通过TokenThread.accessToken获取一次

public class ThreadTest implements Runnable {
   private static final Logger logger = Logger.getLogger(ThreadTest.class);

   @Override
   public void run() {
       while (true) {
           logger.info("access_token为:"+TokenThread.accessToken);
           try {
               Thread.sleep(60 * 1000);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
   }
}



测试结果:


和预想中一样,每2分钟更新一次access_token


另外完成了微信模块,即跳转后获取code,然后获取用户openid,通过openid获取微信用户信息,这个以前写过挺详细的,这里就不写了


2.学会了如何在公司框架中手写sql语句并使其生效

我终于理解以前师兄跟我说过如果建表的时候不写sql文会很麻烦的意思了,的确很麻烦

我们要根据用户uid来查询签到表sign中相应的签到记录create_at,即getSignIdsByUId

①core包,要更改的是service和sca

service

sca

②service包,要更改的是ServiceImpl和相应的dao文件

ServiceImpl,根据uid获取响应的id列表

@Override
public List<Long> getSignIdsByUId(long uid)
     throws ServiceException, ServiceDaoException {

  List<Long> idList = null;


  try {
     idList = dao.getIdList("getSignIdsByUId",new Object[] {uid}, false);
  } catch (DaoException e) {
     log.error(e);
     e.printStackTrace();
     throw new ServiceDaoException(e);
  }
  if (log.isInfoEnabled()) {
     log.info(" get ids success == : " + (idList == null ? "null" : idList.size()));
  }
  return idList;
}


dao文件


测试语句

ids = signService.getSignIdsByUId((long) 5);


测试结果:



明天计划的事情:

完成签到接口


遇到的问题:


收获:

1.学会了怎么不使用定时框架而简单的使用定时功能

2.学会了怎么在公司框架中手写sql语句


进度:

微信模块已完成,接下来是签到接口的编写


返回列表 返回列表
评论

    分享到