分类 其他 下的文章

我转到现在这个海外事业部的时候,这边使用的开发环境和测试环境都是docker。每个开发者都有自己的docker开发环境,自测通过后,部署到测试环境。

但是使用的时候,发现开发环境和测试环境都有一个问题,就是不论是service还是portal的日志,每30分钟就被清空了,我以为是被log4j归档了,看了下归档文件夹,里面有这个日志文件,但是文件为空。

这个问题实实在在困扰我了好久,因为无法追查历史日志,导致测试报问题的时候,只能去重现实时tail日志,非常麻烦。

我一开始以为就是log4j配置的归档时间是每30分钟,但是我看了log4j的配置文件,是1个小时,线上也是这个配置,线上没有这个问题。

后来我怀疑,是不是这个docker本身对某些卷定时操作,但是我看了下docker的启动配置,也没有。

并且,每个人的开发环境和测试的测试环境都有这个问题,很很很很奇怪!

再来后,开发任务紧张,这件事就放下了。

- 阅读剩余部分 -

首先,crontab要执行的任务要有输出日志,表明任务执行过。

然后,另起一个crontab任务,去监控上面的这个日志,比较日志的更新时间,判断任务是否执行,从而提醒。

下面是我在实际生产环境中使用的一个脚本示例:

timestamp() {
  date +"%s"
}
url="http://报警url"

last_mofidy_timestamps="$(stat -c %Y /home/example/example.log)"
echo $last_mofidy_timestamps

current_timestamps="$(timestamp)"
echo $current_timestamps

if (($current_timestamps - $last_mofidy_timestamps > 3600)); then
    curl $url
fi

这周前几天,同事问我,使用Fastjson进行Json的处理,需要转成Json的对象中还有null值,输出成JsonString后,该值和所对应的key都没有了。他的代码是这样的:

Map<String, String> map = new HashMap<String, String>();
map.put("a", "12");
map.put("b", null);
String jsonString = JSONObject.toJSONString(map);
System.out.println(jsonString);

输出为:

{"a":"12"}

b的key没了,value也没了,而对于使用该接口的下游系统来说,有key而value为null与无key是完全不同的概念,所以需要下发该key。

我搜了下,网上有提供方案,使用SerializerFeature.WriteMapNullValue。如下:

Map<String, String> map = new HashMap<String, String>();
map.put("a", "12");
map.put("b", null);
String jsonString = JSONObject.toJSONString(map,
        SerializerFeature.WriteMapNullValue);
System.out.println(jsonString);

输出为:

{"b":null,"a":"12"}

- 阅读剩余部分 -

上次在慕课网看了一个Java分页原理与实践(上)的视频,看了觉得没有什么难得。昨天晚上无聊就想写下分页,毕竟这两年工作,我没有自己写过分页功能,只是用写好的,这个功能还是很重要的。

当然分页不只是Java才会有这种功能,跟编程语言没有丝毫关系。只是前几天,我在oschina上看到一个mybatis的分页插件mybatis-paginator,就像拿来做下实验。

分页,pagination,这个功能的作用我认为主要有两点:

  1. 服务端和客户端之间,可以减少数据传输量,不用每次都将所有的数据下发到客户端,每次下发一页或者几页就可以了;
  2. 服务端内,数据库不用每次都将所有的数据查出来,每次查指定页的数据即可,减轻了数据库的压力。

- 阅读剩余部分 -

纵观各大语言及Web开发框架(先挖个坑),配置URL和Controller的方式有以下几种:

  1. XML配置
  2. 注解
  3. 代码

XML配置

来个Spring MVC的:

Go语言的Web框架Revel采用配置文件,但不是XML格式的,我觉得可以放在这里(代码来自Revel官方文档

# conf/routes
# This file defines all application routes (Higher priority routes first)
GET    /login                Application.Login       # A simple path
GET    /hotels/              Hotels.Index            # Matches with or without trailing slash
GET    /hotels/:id           Hotels.Show             # Extract an embedded argument
WS     /hotels/:id/feed      Hotels.Feed             # WebSockets.
POST   /hotels/:id/:action   Hotels.:action          # Automatically route some actions.
GET    /public/*filepath     Static.Serve("public")  # Assets served from /public/...
*      /:controller/:action  :controller.:action     # Catch all; Automatic URL generation

- 阅读剩余部分 -