在用户操作量较大的情况下,如果实时写入日志会导致资源被严重占用,用户长时间获取不到返回结果,影响用户体验,所以日志操作通常是在用户操作完后放入异步队列,等用户操作少的时间段再将日志写入数据库。
此处实现异步日志写入用到了并发包下的ConcurrentLinkedQueue,一个线程安全的队列实现,遵循FIFO原则进行排序,采用CAS操作,来保证元素的一致性。
首先采用模板模式,定义一个异步队列服务的模板类BaseAsyncQueueService,其中包含一个队列log_queue,和异步操作的抽象方法asyncProcess()。
/**
* 基础异步队列服务,用于异步保存日志信息
*/
public abstract class BaseAsyncQueueService<T> {
/**
* 处理,消费
* @param t
* @return
*/
public abstract boolean asyncProcess(T t);
/**
* 队列
*/
private ConcurrentLinkedQueue<Object> log_queue;
public BaseAsyncQueueService() {
log_queue = new ConcurrentLinkedQueue();
}
public synchronized boolean isEmpty() {
return log_queue.isEmpty();
}
public synchronized int getSize() {
return log_queue.size();
}
public synchronized T poll()