SEMQ的乙個不符合時序控制的傳輸現象

2021-06-27 15:46:19 字數 1973 閱讀 1437

零售商端tb_0031中具有相同時序控制鍵(f023v_0031)的單據訊息(可能是按每一部分包含一張單據的不同明細抽取的,並指定以增量修改方式處理),傳送狀態全部為ss_ack(6).

時序控制的核心邏輯是:端-端確認,具有相同時序鍵的訊息只有在上乙個訊息確認送達(ss_ack2=100)後才能傳送下乙個訊息.

這個現象應該隱藏著乙個bug.

semq佇列元素的傳送狀態定義如下:

enum ;
各種狀態解釋如下:

ss_unsend:未傳送,進入傳送佇列

ss_send表示應用程序嘗試了傳送,只是進入記憶體中的待傳送任務佇列中,甚至可能沒有執行網路層的傳送.

ss_ack:目標或中轉返回的確認訊息

ss_ack2:目標方的接受確認

ss_suspend,ss_suspend2,ss_abandon保留.

相同時序鍵的多條單據訊息,在傳送端的傳送狀態都是ss_ack.這是非預期的情況.

按設計邏輯,這些訊息應當序列地改變,只有上一條訊息(相同時序鍵的訊息按object_id公升序排序)變成ss_ack2後,下一訊息才開始傳送.

808-mt_indication處理

...unsigned short status = isemq::ss_ack2;

if(src_t == pt_central && qe.dest_type_ != pt_central)

status = isemq::ss_ack;

...}

目標為平台的訊息的最終狀態isemq::ss_ack.

***應該統一狀態圖.

中轉節點只負責執行一次傳送,傳送狀態為ss_send就不再處理了.後續由傳送端檢查和控制.

以下**應該是可以消除的:

if(src_t == pt_central && qe.dest_type_ != pt_central)

status = isemq::ss_ack;

810-mt_confirmation處理

getdbc_return(pdbor,this->local_dbc_.c_str(),-1);

pdbor->begintrans();

if (semq_.updatestatus(ssr.record_id_,status))

///< 如果目標是平台(且status==6)或者已送達,該確認的是有時序控制的記錄,則取下一條

if ((qe.dest_type_==pt_central||status==isemq::ss_ack2)&&!qe.sc_key_.empty())

else if (ret==-1)

} 傳送狀態改變:

int csemq::getdata(string &sql)

傳送時進行時序控制.

f017c_0031標誌

f017c_0031被定義為確認標誌,幾經版本變化,現在已經沒有意義不需要了. (一旦修改semq中使用f017c_0031的**後需要對整體分布式通訊環境測試)

f016c_0031可以區分可靠性級別和相應的傳輸確認機制.不再需要f017c_0031.

廢除f017c_0031可簡化邏輯,提高效能.如問詢和時序控制條件:

inquiry_expr_ = "((f016c_0031=3 and f009n_0031=4) or (f017c_0031=1 and f009n_0031=6))"; ///< f017c_0031=1實際上包含了f016c_0031(必須為3)

seqctrl_expr_ = "((f016c_0031=3 and f009n_0031 in (4,10,12)) or (f017c_0031=1 and f009n_0031=6))";  ///< 時序控制時判定是否還有未處理的先前記錄的過濾條件(如一張單據的2次改變產生的2條記錄,第1條未確認則後面的不傳送)

處理:問題待測試和定位

不符合eslint的一些寫法總結

具體可以上eslint官網進行檢視,此處只是我自己的一些需要糾正的寫法 1.consistent return 解釋 要求 return 語句要麼總是指定返回的值,要麼不指定 錯誤寫法 function dosomething condition else 改正後 function dosometh...

許可權控制的乙個思路

資料庫表結構 create table newtable id int 11 not null auto increment,title varchar 255 not null menu id int 11 not null module varchar 50 not null class var...

使用jmeter請求乙個符合預期的錯誤請求

在使用jmeter做介面請求的時候,使用邊界值方法請求來驗證後台是否進行限制。比如,做髮資訊介面時候,經常就要測試標題為空的狀態,那麼正常的請求就會出現請求失敗的狀態,而且檢視結果樹就會看到返回的是400 想展示的一樣,但是這個是符合預期的。那麼問題來了,我們這個請求是報紅的,在輸出報表的話又會產生...