批量執行狀態查詢報空指標異常解決

2021-07-24 07:03:07 字數 1497 閱讀 4530

伺服器上發現批量執行狀態查詢有時會報系統未知錯誤,然後查詢日誌發現,batch端返回的rejcode=null,導致mweb無法識別錯誤型別。

但是為什麼rejcode會等於null呢?

跟蹤**發現,batchtemplate裡面有乙個try catch,在catch裡面會給rejcode重新賦值,所以驗證try裡面的**

try  catch (throwable t)  catch (throwable t1) 

context.setdata("_responserejmsg", msg); } 

發現只有execute報空指標錯誤才能將rejcode賦值為null

跟蹤發現super.execute執行的是jobstatusqryaction

在這個action裡面有兩個地方有可能會引起空指標,所以增加日誌

if (jobid != null && jobid.length() > 0)  else 

} else  

else  }

} }} }

context.setdata("joblist", joblist);

context.setdata("jobloglist", jobloglist); }

發現此處標紅**會引起空指標。為什麼這裡會空指標呢?

經排查發現是由於batch處理併發時,效率太低,引起死迴圈,導致此處remove為空

private mapjobmap = new hashmap();// 已初始化未完成的批量

private mapjobmap = new concurrenthashmap();// 已初始化未完成的批量

將此處hashmap改為concurrenthashmap

為什麼此處不能用hashmap?因為hashmap執行緒不安全,在多執行緒環境下,使用hashmap進行put操作會引起死迴圈,導致cpu利用率接近100%,所以在併發情況下不能使用hashmap。

以下來自網上摘抄:

hashtable容器在競爭激烈的併發環境下表現出效率低下的原因,是因為所有訪問hashtable的執行緒都必須競爭同一把鎖,那假如容器裡有多把鎖,每一把鎖用於鎖容器其中一部分資料,那麼當多執行緒訪問容器裡不同資料段的資料時,執行緒間就不會存在鎖競爭,從而可以有效的提高併發訪問效率,這就是concurrenthashmap所使用的鎖分段技術,首先將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當乙個執行緒占用鎖訪問其中乙個段資料的時候,其他段的資料也能被其他執行緒訪問。

大致意思就是:concurrenthashmap將資料分段儲存,並對每段資料都分配了一把鎖,這樣執行緒就有多條路,也不會在一條路上堵塞,引起崩潰。

另外在解決這個問題的時候發現manifest.mf檔案裡面有乙個很有意思的引數

csii-autostart: true  //如果為ture則pe部署平台的普通使用者可以在batch的包列表裡面可見,預設為false 只有管理員sysadmin使用者可見

csii-startlevel: 8      //包啟動級別,級別低的啟動優先。

mysql 執行狀態

show processlist 或使用mysql administrator 檢視當前執行connection的狀態 state列出的狀態主要有以下幾種 checking table 正在檢查資料表 這是自動的 closing tables 正在將表中修改的資料重新整理到磁碟中,同時正在關閉已經用...

程序執行狀態

程序是乙個動態的實體,所以他是有生命的。從建立到消亡,是乙個程序的整個生命週期。在這個週期中,程序可能會經歷各種不同的狀態。一般來說,所有程序都要經歷以下的3個狀態 就緒態。指程序已經獲得所有所需的其他資源,正在申請處理處理器資源,準備開始執行。這種情況下,稱程序處於就緒態。阻塞態。指程序因為需要等...

linux Shell 查詢服務執行狀態相關命令

ps ef grep servername.jar grep v grep awk 備註 grep v grep 含義是過濾掉grep 程序 awk 含義是按空格或tab分割,輸出第2項 kill 9 pid ps ef grep servername.jar grep v grep wc l 備註...