发表于: 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语句
进度:
微信模块已完成,接下来是签到接口的编写
评论