springboot利用執行緒池非同步記錄日誌(二)

2021-10-24 04:12:52 字數 3131 閱讀 7170

緣由

在業務邏輯中記錄日誌,繁瑣且耦合度高,利用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 這個方法只在外部呼叫才會開...