緣由
在業務邏輯中記錄日誌,繁瑣且耦合度高,利用aop結合註解形式,更便捷
步驟
/**
* 自定義日誌記錄注釋
* /@target()
@retention(retentionpolicy.runtime)
@documented
public @inte***ce log
/**
* 自定義的日誌資料實體類
* /public class sysoperlog extends baseentity
/**
* 針對自定義的log注釋,實現aop攔截
* 在內部整理日誌引數,插入到資料庫,實現日誌記錄
* /@aspect
@component
public class logaspect
/*** 處理完請求後執行
** @param joinpoint 切點
*/@afterreturning(pointcut = "logpointcut()", returning = "jsonresult")
public void doafterreturning(joinpoint joinpoint, object jsonresult)
/*** 攔截異常操作
* 主要看的就是這個方法
* 也就是說,在日誌資料插入資料庫的這個過程,是由新建立的乙個執行緒去執行的
* 這樣日誌記錄中像與mysql互動這樣耗時的操作,就不會耗費主線程的時間了
* * @param joinpoint 切點
* @param e 異常
*/@afterthrowing(value = "logpointcut()", throwing = "e")
public void doafterthrowing(joinpoint joinpoint, exception e)
protected void handlelog(final joinpoint joinpoint, final exception e, object jsonresult)
// 獲取當前的使用者
loginuser loginuser = springutils.getbean(tokenservice.class).getloginuser(servletutils.getrequest());
// ******===資料庫日誌*****====*//
sysoperlog operlog = new sysoperlog();
operlog.setstatus(businessstatus.success.ordinal());
// 請求的位址
string ip = iputils.getipaddr(servletutils.getrequest());
operlog.setoperip(ip);
// 返回引數
operlog.setjsonresult(json.tojsonstring(jsonresult));
operlog.setoperurl(servletutils.getrequest().getrequesturi());
if (loginuser != null)
if (e != null)
// 設定方法名稱
string classname = joinpoint.gettarget().getclass().getname();
string methodname = joinpoint.getsignature().getname();
operlog.setmethod(classname + "." + methodname + "()");
// 設定請求方式
operlog.setrequestmethod(servletutils.getrequest().getmethod());
// 處理設定註解上的引數
getcontrollermethoddescription(joinpoint, controllerlog, operlog);
// 儲存資料庫
asyncmanager.me().execute(asyncfactory.recordoper(operlog));
}catch (exception exp)
", exp.getmessage());
exp.printstacktrace();}}
/*** 獲取註解中對方法的描述資訊 用於controller層註解
* * @param log 日誌
* @param operlog 操作日誌
* @throws exception
*/public void getcontrollermethoddescription(joinpoint joinpoint, log log, sysoperlog operlog) throws exception
}/**
* 獲取請求的引數,放到log中
* * @param operlog 操作日誌
* @throws exception 異常
*/private void setrequestvalue(joinpoint joinpoint, sysoperlog operlog) throws exception
else
}/**
* 是否存在註解,如果存在就獲取
*/private log getannotationlog(joinpoint joinpoint) throws exception
return null;
}/**
* 引數拼裝
*/private string argsarraytostring(object paramsarray)}}
return params.trim();
}/**
* 判斷是否需要過濾的物件。
* * @param o 物件資訊。
* @return 如果是需要過濾的物件,則返回true;否則返回false。
*/public boolean isfilterobject(final object o)
}
springBoot執行緒池
1 定義執行緒池 enableasync configuration classtaskpoolconfig 上面我們通過使用threadpooltaskexecutor建立了乙個執行緒池,同時設定了以下這些引數 說明 setwaitfortaskstocompleteonshutdown true...
Springboot 執行緒池
配置類 configuration enableasync public class taskpoolconfig 執行執行緒中,如果有區域性變數要使用 或者有外部值傳入 新建thead 實現callable介面 可以直接使用函式中的值的話使用lambda表示式,使用completionservic...
springboot 執行緒池
1 在啟動類上加標記 enableasync slf4j exclude enableasync public class extends springbootservletinitializer 3 使用,方法名上加 async asyncserviceexecutor 這個方法只在外部呼叫才會開...