23
Message Queue Service (MQS) 陳瀛洲 製作 訊息服務系統

Message Queue Service

Embed Size (px)

Citation preview

Page 1: Message Queue Service

Message Queue Service(MQS)

陳瀛洲 製作

訊息服務系統

Page 2: Message Queue Service

目的: 做為應用程式的訊息交換中心就像是個 HUB

Page 3: Message Queue Service

架構示意圖

Page 4: Message Queue Service

內部模組關聯圖

Page 5: Message Queue Service
Page 6: Message Queue Service
Page 7: Message Queue Service

傳輸規格

$SUBscriber:<用戶名稱> [Join:<群組清單>]   QID:<佇列清單> [Since:<時分>] [Last:<筆數>]

TCP Port#23: 文字模式 (CR/LF結尾)

註冊訂閱

客端第一個發出的命令一定是註冊 $SUB

$PUBlisher { To:<用戶清單> | QID: <佇列清單> } Text:<訊息>

發佈

PING 閒置時會送出以確保連線正常, 若線路有問題時會產生錯誤.BYE 客端離線前送出的簽退命令, 伺服器端會主動斷線.GetUser 要求返回伺服器上現有的連線用戶清單.GetQID 要求返回伺服器上現有的佇列清單.

系統命令 @<命令> [ : <回覆訊息> ]

(Raw Data Format)

Page 8: Message Queue Service

以 NetCat 來觀察傳輸狀況

Page 9: Message Queue Service

以 NetCat 來觀察傳輸狀況

$SUB:某甲 $SUB:某乙

$PUB To:某乙 Text:後天的案子可以完成嗎?

Enter

2012-06-05 10:20:10 10.10.11.150 某甲 * 後天的案子可以完成嗎?

$PUB To:某甲 Text:這兩天要加班了!!

2012-06-05 10:23:20 10.10.11.160 某乙 * 這兩天要加班了!!

<日期時間> <IP> <發信者> <佇列清單> <訊息>接收訊息

• 同一訊息可能來自多個佇列,但只會收到一份訊息• 佇列清單若為 ‘星號’ 表示由發信者指定用戶送出

Page 10: Message Queue Service

DELPHI 模組及元件

如果編譯成元件, 使用時直接拉到表單上, 在專案中就不必特別包含這四個模組單元

使用事件反應是否有訊息到達, 不佔用主執行緒的時間

Page 11: Message Queue Service

EMail 派送系統應用 (1)

•統一電子郵件派送功能•提供多附件夾檔, 可用中文檔名•剔除最近要求重複寄送的郵件•保留最近傳送日誌, 以供備查

MQS QID=MAIL

MQSMail

程式1 程式N

Page 12: Message Queue Service

EMail 派送系統應用 (2)

Mail := TMQMail.Create; try with Mail do begin //{.}CharSet := 'Big5'; {.}From := editFrom.Text; {.}ToList.Assign(editToList.Lines); //{.}CCList.CommaText := '[email protected], [email protected]'; //{.}BCCList.CommaText := '系統管理者<[email protected]>';

{.}AttachList.Assign(editAttachList.Lines); {.}Subject := editSubject.Text; {.}Body.Assign(editBody.Lines); end; MQClient1.SendMail(Mail); finally Mail.Free; end;

Page 13: Message Queue Service

EMail 派送系統應用 (2)

1.從元件盤拉出 MQClient2.檢視器中填上 QIDList 填入 MAIL3.檢視器中填上 UserID 填入應用程式的名稱4.視窗中拉出信件所需欄位 若是在程式中給定則不用

Mail := TMQMail.Create; try with Mail do begin //{.}CharSet := 'Big5'; {.}From := editFrom.Text; {.}ToList.Assign(editToList.Lines); //{.}CCList.CommaText := '[email protected], [email protected]'; //{.}BCCList.CommaText := '系統管理者<[email protected]>';

{.}AttachList.Assign(editAttachList.Lines); {.}Subject := editSubject.Text; {.}Body.Assign(editBody.Lines); end; MQClient1.SendMail(Mail); finally Mail.Free; end;

1

2

3

editFromeditToList

editAttachList

editSubjecteditBody

Page 14: Message Queue Service

EMail 派送系統應用 (3)var S: string;

S := 'FROM=陳瀛洲 <[email protected]>'#13#10 + 'TO="安台 <[email protected]>", "詩虔 <[email protected]"'#13#10 + 'ATTACH="\\fs\暫存區\週末清除\測試檔1.txt","\\fs\暫存區\週末清除\測試檔2.txt"'#13#10 + 'SUBJECT=這是一個文字字串轉發郵件的示範'#13#10 + 'BODY=各位好,'#13#10 + ''#13#10 + '可以將這些文字以文檔方式載入 TStringList.Text 中,'#13#10 + '然後以 MQClient.SendData(StringList.Text) 送給 QID=MAIL,'#13#10 + '不見得一定要用 TMQMail 的元件,視那種比較方便而定,'#13#10 + '要注要: 在 "TO="、"ATTACH=" 等含多個欄位(以逗號分隔的清單)時,'#13#10 + '若欄位值含空白或逗號時必須用雙引號括住每個欄位,請小心使用。'#13#10 + '當然這也是為什麼要用 TMQMail 元件,這樣就不必考慮這些細節。'#13#10 + ''#13#10 + '--'#13#10 + '陳瀛洲'#13#10;

with GetMQClient do begin {.}QIDList := 'MAIL'; {.}UserID := 'Tony'; {.}SendData(S);end;

電子郵件不見得一定要用 TMQMail 物件,

也可以用多行字串表示郵件資訊。

每一行最前面是 "關鍵字=", 關鍵字有:

From, To, Cc, Bcc, Attach, Subject,

Body (不分大小寫, Body 請放最後)

Page 15: Message Queue Service

SMS 簡訊派送系統應用 (1)

•統一簡訊派送功能•剔除最近要求重複寄送的訊息•保留最近傳送日誌, 以供備查

MQS QID=SMS

MQSSMS

程式1 程式N

MIOD

Page 16: Message Queue Service

SMS 簡訊派送系統應用 (2)// 範例一: 使用 stringvar S: string;

S := '092222222'#13#10 + '測試訊息1'#13#10 + '測試訊息2'#13#10;

with GetMQClient do begin {.}QIDList := 'SMS'; {.}UserID := 'Tony'; {.}SendData(S);end;

// 範例二: 使用 TStringListvar List: TStringList;List := TStringList.Create;try List.Add('092222222'); List.Add('測試訊息1'); List.Add('測試訊息2'); GetMQClient.QIDList := 'SMS'; GetMQClient.UserID := ‘Tony’; GetMQClient.Send(List.Text);finally List.Free;end;

傳送字串第一行為受信方電話, 若有多個

受信方請用逗號隔開。

第二行後為簡訊內容, 若含中文字時請在

80字元以內(一個中文當兩個字元)。

Page 17: Message Queue Service

QTTRNSvc N

報關運輸報價查詢系統應用 (1)

•提供多項參數查詢所需報價單•可同時執行多個服務複本(不同主機), 以供大量查詢需求•保留最近查詢日誌, 以供備查

MQS QID=QTTRN Reply

QTTRNSvc 1

程式1 程式N

資料庫

Listen

開發設計期

Page 18: Message Queue Service

報關運輸報價查詢系統應用 (2) MID := Sender.ReplyMID; if Sender.NeedReply and (MID <> 0) then begin try DoOpenDB; try // 取得查詢命令 FQCmd -- 為 Client 送出的物件 Sender.GetComponent(FQCmd);

FQReply.Cookie := FQCmd.Cookie; FQReply.Tag := FQCmd.Tag; ... 將查詢結果存入 FQReply.Data -- array of Variant

MQ.ReplyMID := MID; MQ.SendData(FQReply); // 回覆結果給指定的 MessageID finally ... 清理工作 ... end; except ... 錯誤處理 ... end; end else begin LogMsg('接收錯誤> 非 Reply 訊息, 不予處理.'); end;

// Listen 模式收到要求訊息後會先 detach 該 Queue (此時 TCP/IP 並未斷線), // 處理完後必須執行 SignOn, 這時 MQS 服務才會再次 attach 指定的 Queue, // 若有新的要求訊息, 此後 MQS 才會將之送過來. MQ.SignOn;

TMQClient.OnRecvMsg 事件

主要處理邏輯

查詢的關鍵字(括號中的英文名稱)--> FQCmd.Data (TStringList)若未指定該關鍵字則不會列入查詢的 SQL

有效報價單(EffectFlag): Y生效日期(EffectDate1,EffectDate2): YYYYMMDD 報價日期(QTDate,QTDate2): YYYYMMDD報價單號(QoutNo1,QuotNo2):報價類別(QTType): 逗號隔開字元, 例如: 'W','D',...業績站別(AccStation): 逗號隔開字串, 例如:'AJ100','AF100',...併車/專車(VIP): Y 或 N往返報價(ReturnFlag): Y客戶代碼(Client):負責業務(Sales):費用代碼(ChgCD):起站代碼(SiteFrom):迄站代碼(SiteTo):車種代碼(CarType):車噸代碼(CarWeight):

QTTRNSvc 程式

Page 19: Message Queue Service

報關運輸報價查詢系統應用 (3)Cmd := TMQQueryCmd.Create(nil);try Cmd.Data.Add('Client=A098’); Cmd.Data.Add(‘QTType=W’); Cmd.Data.Add('SiteFrom=011’); Cmd.Data.Add('SiteTo=399’); Cmd.Data.Add('VIP=Y’); Cmd.Data.Add('EffectFlag=Y’); Cmd.Data.Add('CarType=TN’); MQ.Reply := True; MQ.SendData(Cmd);finally Cmd.Free;end;

TMQClient.OnRecvMsg 事件:

Reply := TMQQueryReply.Create(nil);try Sender.GetComponent(Reply); if Reply.ErrMessage <> '' then begin LogMsg('錯誤訊息> '+Reply.ErrMessage); end else begin if Reply.Count <> 1 then raise Exception.Create('返回查詢資料錯誤.'); CDS1.Data := Reply[0]; finally Reply.Free; end;

QTTRN 客端查詢程式- Demo/Project4.dpr

Page 20: Message Queue Service

MQS 訊息服務系統

佇列及用戶特性可動態修改按【重載Dispatcher】即可生效

Page 21: Message Queue Service

MQS 訊息服務系統設定檔(1)[Global];;每多少毫秒更新畫面一次: 100~10,000 ms, 預設 1 秒;TimeInterval=1000

;;以下兩個值請採用質數以減少碰撞處理,;;可能會影響即時的反應效能;;;;Queue 多久儲存一次: 10~3600 秒, 預設 37 秒;SaveQueueSeconds=37;;;;多久送出一次 @PING: 10~3600 秒, 預設 57 秒;PollingClientSeconds=57

;;預設編輯器;Editor=notepad

;;Log 目錄所在, 可用下列指期定日期每日自動切換;;若未指定則不會自行切換目錄;; %d: 01~31 (Day of Month);; %w: 0~6 (Sun:0, Mon~Sat:1~6);; %m: 01~12 (Month);; %y: yyyy (Year);LogRotatePath=Log.%y\%m\%d;LogRotatePath=Logs\W%wLogRotatePath=Logs\%d

;;Queue 暫存目錄, 預設無, 同執行程式的目錄QueuePath=Queues

;;Message Queue Service 的 TCP 服務端口: 預設值為 23ServerPort=23

;;每一訊息允許最大長度(數字後可加 K,M), 預設 2M ;;註: 這是指 TidTCPClient 的 MaxLineLengthMaxMsgSize=15M

;;系統日誌每行訊息最大長度: 預設為 4000 字元MaxLogLineLength=1000

;;儲存 MessageID (檔案:MQS.MsgID) 間隔: 10~3600 秒;SaveMsgIDSeconds=600

;;Reply 訊息最多保留時間(秒), 逾時則將之刪除;ReplyTimeoutSeconds=7200

MQS.INI主程式設定檔, 僅開始執行時讀取一次, 若有修改必須重啟程式才會生效

Page 22: Message Queue Service

MQS 訊息服務系統設定檔(2)[Group]mis=suezou,inchen,hsya,jmju,cwfeng,jhliang,srtsaiop=angellee,grace,sammi,shwangtsmcImport=angellee,grace,sammi,shwangtsmc=mcchen,chinling,ychuang,ruyeh,nikyang,yajyangtsmc=yywang,yjlu,hjchang,may_shuftp=ftp_FTP01,ftp_example2000,ftp_example-ftp

;User=QueueList,@GroupList[User];angellee=@op,@tsmcImport;grace=@op,@tsmcImporttonychen=@mis

[Queue]List=SYSLOG,MAIL,SMS,FTPKSize=16Count=100Timeout=0Round-Robin=MAIL,SMSWait=MAIL,SMS;啟用內定服務 SysLog 時請指定其 QIDSysLog=SYSLOG

;[Q_Default];KSize=32; 每一訊息前要額外增加4個字元(長度); 訊息格式: <Timestamp:8> <MID:4> <SID:4>; <IP:IPSize> <UserID:IDSize> <Text>;;Public=True/Yes/1 或 False/No/0, 預設為 True; 是否允許註冊時指定本佇列 (MsgID=QID);;Type=Share 或 Round-Robin, 預設為 Share; Share: 訊息會同時送給此 Queue 所有的 Users; Round-Robin: 訊息每次輪流給予一個 User;;Wait=True/Yes/1 或 False/No/0, 預設為 False; 發佈訊息時若無人等待中, 則先暫存於 Wait Queue;;Count=500; 最多保留 500 個訊息, 若為零則不檢查 ; 若 Count 和 Timeout 兩者皆為零時, 則視同 ; Count=100, 即只保留最近 100 個訊息 ;;Timeout=1800; 保留最近 1800 秒內的訊息, 若為零則不檢查;;Users=@Group,User,...; 指定預設給那些 Users 或 @群組MQS-Queue.ini

Page 23: Message Queue Service