Arganzheng's Blog

stay hungry, stay foolish

Quartz突然停止执行问题

现象 线上的API监控系统有一段时间没有发报警邮件了,觉得有点异常,测试同学特意写了一个抛出错误的python校验器,结果发现也是没有收到邮件。 原因 表面现象是没有收到报警邮件,那么有可能是: job没有执行 校验器没有错误:根据前面的验证,可以直接排除。 邮件没有发送 通过在job执行前后打日志,发现一个问题: 有些job只有start日志,没有end日志,也就是说卡住了。然后整个Quartz的QRTZ_FIRED_TRIGGERS表就占满了处于EXECUTING状态的job(我们的Quartz线程池个数配置为8个)。然后线程池空了,没有线程可以执行新的job。 那么job是卡在哪里呢? 通过jstack -l pid发现,所有的...

Java文件读取支持timeout

我们知道系统的IO操作一般分为阻塞IO和异步IO两种。对于Java来说,1.4之前的IO是Blocking IO,1.4引入的NIO其实也是,但是它有两个好处: select可以同时监听多个文件描述符,而这些文件描述符其中的任意一个进入读就绪状态,select()函数就可以返回。这也是它被称为IO复用的原因。 如果select返回的时候,调用相应的Blocking IO操作一般不会“阻塞”,因为文件描述符已经是ready了。需要的时间只是将数据从内核copy到用户空间(或者相反) 但是对于NIO的IO复用只支持网络IO,对于文件系统的读写,还是传统的Blocking IO方式。这种情况,直到Java 1.7的出现才解决。Java 7引入的Asynchr...

nginx日志自动按天分隔

log4j可以的DailyRollingFileAppender可以实现日志按天归档,避免日志过大。同时也方便按天查询统计日志。但是nginx没有实现这个功能,所有的日志都是一个文件死磕到底。像error_log还好,但是access_log一般都比较大,按天归档是很有必要的,怎样实现呢? 可以这样简单处理: 写一个脚本: nginx_log_split.sh #!/bin/bash nginx_dir="/home/soft/resty/nginx" cd $nginx_dir log_dir="${nginx_dir}/logs" pid_dir="${nginx_dir}/logs" time=`date +%Y%m%d` for logfile i...

JPA的事务管理器配置

Guanxing工程在后来为了避免写DAO,引入了JPA。为了避免影响老的工程,JPA使用了自己的事务管理器。 spring-service.xml <!-- 事务配置 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /...

移动终端设备唯一标识

背景 在不需要用户登录或者没有用户概念的移动互联网产品中(如百度,今日头条,浏览器等),设计一种稳定的能够唯一标识客户设备的id(CUID),相当于移动互联网的用户 cookieid(匿名用户id),使得客户端自身以及和服务端交互时所产生的每一条行为日志的都能够找到对应到相应的设备标识,方便追踪和分析用户。 理论上每台终端机器都有一个唯一的设备号,如 Android 的 IMEI(International Mobile Equipment Identify),IOS 的 IDFA/IDFV。但是实际使用中会遇到各种各样的问题。 Android平台: 因为各种『中国特色』场景,并引发各种终端属性不靠谱的问题 山寨机: 一批或多批出货的手机终端属性可能都...

Quartz工作机制

使用了几年Quartz,其实还是停留在使用的层面,最近想做一个自动化监控报警的,想了解一下Quartz是怎样定时触发job的。于是深入了解了一下代码。 启动初始化 Quartz启动时会根据配置信息进行相应的初始化。例如下面的这个spring-quartz.xml配置文件: <?xml version="1.0" encoding="GBK"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" ...

日志监控系统

What is a Log? Timestramp + Data = Log Life of a Log record => transmit => analyze => store => delete Related Tools(open source) transport: flume, fluentd, scribe, rsyslog, syslog-ng search+analytics: hadoop, graylog2, elsa storage: hdfs, cassandra, elasticsearch data visualize: kibana, graphite logstash ...

MySQL用户授权

MySQL的用户创建和授权基本是通过一个命令解决: GRANT privileges ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION  要使用该语句,你需要填写下列部分: 1、privileges : 授予用户的权限,下表列出可用于GRANT语句的权限指定符: Alter 修改表和索引 Create 创建数据库和表 Delete 删除表中已有的记录 Drop 抛弃(删除)数据库和表 INDEX 创建或抛弃索引 Insert 向表中插入新行 REFERENCE 未用 Select 检索表中的记录 Update 修改现存表记录 FILE 读或写服务...

如何构建maven私有仓库

私有仓库,也称之为私服,它是一种特殊的远程仓库。它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的maven用户使用。当Maven需要下载构建的时候,它从私服请求,如果私服不存在该构件,则会从外部的远程仓库下载,缓存在私服上之后,再为maven的下载请求提供服务。此外,一些无法从远程仓库下载到的构件也能从本地上传到私服上供大家使用。 通过建立自己的私服,就可以带来如下几个好处: 加速Maven构建 节省外网带宽 部署第三方构件 节省中央maven仓库的负担 提高稳定性,增强控制 使用Nexus搭建私服 Sonatype Nexus是当前最流行的Maven仓库管理软件。具体搭建非常简单,网上资料很多,这里不赘述了...

实时消息系统设计与实现

特点 实时性 支持群聊与广播 多媒体:text, image, vioce or video 难点 顺序 丢包 重复 设计 client server 会话/群聊 协议 登陆,身份验证 连接 发起会话 退出会话(退群) 消息接收设置 心跳 长连接 终端 接入层: ConnectSvr 逻辑层: SenderSvr, PushSvr, ReceiveSvr 存储层: MsgStore 设计权衡 聊天记录要不要保存?保存多久?客户端保存还是服务器保存? 要不要使用系统推送...

×