2018-12-26 14:40
@lyq027 接上一条补充,前面讲的将 upload 挪到别的地方,这个是让 jfinal undertow 可以当成 web 资源访问,你上传的时候要上传到这里,还需要如下配置:
configConstant(Constants me) {
me.setBaseUploadPath("/var/my-project/upload");
}
windows 系统下也是一样,只不过目录是下面这样的:
D:/my-project/upload
一定要是绝对路径才可以
2018-12-26 11:10
@yuer_2018 以前是任何时候都可以发贴和回贴的,但网上打广告发水贴的那个群体正好是在我们睡觉后最活跃的,你懂的
可发贴可回复的时间大概在早八点半到晚十点半,可能有半个小时的不确定
2018-12-26 11:07
@mekain 解决就好,删掉 Jetty 的依赖在《极速上手》 中有过说明:
https://gitee.com/jfinal/jfinal-undertow
2018-12-26 11:05
这个方案无疑是在老版本 jfinal 1/2 中使用 enjoy 的最佳方案,十分简洁,并且没有任何副作用
这个方案还有一个可以改进的地方,老版本的 jfinal 也是可以通过 IRenderFactory 切换底层的 main render 的,通过实现 IRenderFactory 接口,可以将 Controller.render(String view) 这个方法的 view type 给切换到 enjoy
当然,如果你的老系统中 render(String view) 仍然在使用 freemarker 之类的使用 BaseController 扩展是最好的
感谢分享,点赞 + 收藏
2018-12-26 10:57
基于上面的原理,其实还有很多方案,例如,在 mysql 中做一个临时表,例如叫 door_log 表,里面弄两个字段: door_log(long userId, datetime createAt),临时表只做辅助,可以在每天早上使用 Db.update("truncate table door_log") 进行数据清除
用户每次刷卡进入的时候,向这张表里面写数据,然后判断一下该 userId 的最大 createAt 与当前时间的间隔是否大于 10 秒即可,如果大于 10 秒才真正做日志:
Instant ins = LocalDateTime.now().minus(10L, ChronoUnit.SECONDS).atZone(ZoneId.systemDefault()).toInstant();
if (Db.queryLong("select userId where createAt > ?", Date.from(ins)) == null) {
做日志的代码
}
你也可以上上述逻辑用内存来做,在内存里面存放一个 List,里面放下 (userId, createAt) 这两个字段,道理是一样的
2018-12-26 10:28
不要用这种方式, 用一下 ehcache , 配置一个过期时间,大致过程如下:
1:用于这个功能的 ehcache 的 name 假定为 "doorLog",过期时间设置为 1 分钟
2:当用户扫码时,先去看 ehcache 的 doorLog 是否存在,如果存在则不做日志
3:如果 doorLog 不存在,则以用户 id 为 key 做一个日志,大致为:
if (CacheKit.get("doorLog", userId) == null) {
CacheKit.put("doorLog", userId, true);
log.logInfo(...) // 这里是做日志的代码
}
这里的关键就是 ehcache 中的 “doorLog" 的过期时间的配置,当过期时间一致,缓存中就没有数据了,那么前面的 if 语句就会为 true
2018-12-25 18:12
@action_dear60 jfinal 的数据库操作只对 JDBC 做了极薄封装,没有乐观锁方面的支持,建议在现有的体系下,看看哪里可以扩展一下