非同步記錄日誌 獲取非同步處理結果

2021-10-03 22:00:19 字數 2414 閱讀 5468

1.場景

有事務的情況下,記錄將異常資訊記錄到異常表中

2.處理過程

2.1本來是加上never或者notsurport註解,然後在throw拋異常之前把異常資訊插入資料庫,但是未成功,拋異常時回滾

2.2finally中呼叫被@async註解的方法

2.3注意 這個帶@async註解的方法要放在其他的類裡邊

呼叫**

public object loghandler(proceedingjoinpoint proceedingjoinpoint) throws throwable .{}】 開始!入參是【{}】", methoddeclaringclass, methodname,targetmethodparams);

//異常記錄表

pf1013 pf1013 = new pf1013();

try catch (exception exception) .{}】 入參是【{}】,操作人是【{}】",methoddeclaringclass, methodname,targetmethodparams,globalvarvalueutil.getopercode());

pf1013.seterrorinfo(exceptionutils.getstacktrace(exception).substring(0,8000));

throw exception;

} finally .{}】 結束,耗時:{}ms, 請求引數【{}】", methoddeclaringclass, methodname,system.currenttimemillis()-starttime,targetmethodparams);}}

async註解**

@component

@slf4j

public class asynchelper }}

奇怪的是,沒有配置configuration也沒有在啟動類中@enableasync就好用了,眼睜睜看到丟擲異常之後我的異常表裡邊就有資料了

續集來了

以上操作之後  本地確實是好用的   但是 線上確實是不好用的

所以  使用@async還是有注意事項的

1.非同步方法和呼叫非同步方法的方法不能再同乙個類

2.非同步方法加註解@async,呼叫非同步方法的方法所在類要加註解@enableasync

3.方法所屬的類的物件需要是被spring容器所管理的,也就是指被@controller @service @repository @component這些註解的類

修改方法  在上邊第一段**loghandler方法所在類上邊開啟非同步  

因為loghandler是呼叫@async方法的類

後續

protected static threadlocalstack, object>> contextualdata = new threadlocalstack();
非同步想獲得執行結果,需要將被@async註解的方法改為future返回,使用asyncresult

/**

* 引數分類表發布到指定城市

* @param pb207

* @param cityid

*/@datasourcekey(spel = "#cityid")

@async

public futurepublishpb207(pb207 pb207, string cityid)

return new asyncresult<>(boolean.valueof(true));//指定城市是否存在引數分類資料

}

非同步阻塞

首先,同步非同步,阻塞非阻塞,是兩個概念

futureexits = publishutil.publishpb207(pb207, publishcityid);//返回指定城市是否存在引數分類資料

//4.通過pb207的yjywflbm和ejywflbm,分別查詢pb205一級業務分類表和pb206二級業務分類表,如果指定城市有資料就不發布,沒資料就發布

boolean aboolean = exits.get();

if(!aboolean){}

之前之所以用非同步,是因為要進入同事寫的攔截方法,又不知道如何開啟新事物

現在想起來,其實只要用@transactional(propagation= propagation.requires_new)開啟新事物,就不用future.get了

@transactional(propagation= propagation.requires_new)

PLAY2 6 SCALA 六 非同步處理結果

play是乙個自底向上的非同步框架,play處理所有的request都是非同步 非阻塞的。預設的方式是使用非同步的controller。換句話說,contrller中的應用 需要避免阻塞,i.e.不能等待某乙個操作。場景的阻塞操作有jdbc呼叫 streaming api http請求和耗時計算。雖...

Curator 非同步獲取結果

原聲的zookeeper 的crud api有同步和非同步之分,對於非同步api,需要傳遞asynccallback 對於getdata,getchildren,exists這三個api,還可以設定watcher。這些功能在curator中是如何實現的?在curator中,可以通過如下三種方式來非同...

非同步處理日誌

把所有的info日誌,採用非同步模式來處理 環境日誌檔案的io阻塞 public class logtask implements runnable override public void run catch exception e public static void loginfo strin...