java多線程在項目中的應用

多線程對於編程人員都不陌生,好比咱們經常使用的數據庫鏈接池、tomcat等。本博客主要說一下我在工做中對多線程的使用的思考。具體多線程的使用方法就不在這裏向你們介紹了。java

1.背景

我最近作的項目是供應鏈相關的項目,而對於項目中涉及的各類單據都須要傳給另一套系統作帳(財務系統),好比:合同單據、採購單據、收貨單據等,每類單據都會有工做流。數據庫

1) 最初

流程是這樣的 首先在系統建立單據,提交以後開始走審批流及各類通知,當審批流審批結束以後,觸發同步財務系統。當咱們系統有單據發生變化時,若是單據已經審批經過,會將變化的內容推送給財務系統。 編程

那這會有什麼問題呢?假如咱們如今在作一個發票沖銷的功能,當用戶在頁面點擊它以後,首先在咱們系統完成沖銷邏輯,而後調用財務系統將單據同步給它。 tomcat

起初咱們是採用同步的方式調用財務系統的接口,調用財務系統的接口咱們方法又須要等待它返回給咱們操做狀態(成功仍是失敗),而對於有修改的業務方法咱們都會在方法上使用事務,這會致使咱們方法佔用事務時間過長產生數據庫行級鎖衝突問題。多線程

2) 思考

當項目上線以後,常常收到用戶反饋說項目出錯,查看日誌發現常常出現行級鎖問題。爲何會產生行級鎖問題呢?
好比採購單來講,採購單採用的是頭行結構(主單和明細),採購單包含採購的數量,收貨數量,在途數量等字段,而在收貨時,也會操做收貨單對應的採購單,若是在採購單和收貨單同時操做同一採購單號的單據,而且操做字段都須要同步到財務系統,就會致使方法佔用事務過長,更容易產生行級鎖問題。異步

2.解決方案

除了會產生上面所說的行級鎖問題以外,其實還有另一個問題,就是分佈式事務來保證數據一致性問題。分佈式

1) 異步方式

採用多線程的方式,將咱們系統中全部須要同步的到財務系統的地方都改爲異步的方式,由於系統有不少種類型的單據,好比說咱們系統有6種單據,那咱們就建立一個大小爲6的線程池,每一個線程池配一個阻塞隊列。每一個線程池和6種單據一一對應,這樣就能夠保證咱們不會開啓太多線程而佔用系統資源。
java多線程在項目中的應用
例如採購單修改以後,除了作在本系統中的保存以外,同步到財務系統的地方只須要將採購單的同步請求放入線程池中。
除了異步的方式以外,咱們還能夠同步的方式發送給對方系統以後,對方系統當即返回,當對方系統執行完畢以後,回調咱們系統的接口,咱們系統再作成功以後的邏輯處理。ide

2) MQ的方式

除了上面這種方式以外,就是還能夠採用MQ的方式,將須要同步的單據發送到MQ裏面,對方系統從MQ裏面取單據,取出的不一樣單據作不一樣的業務區分。線程

相關文章
相關標籤/搜索