More Related Content Similar to Message Queue Service
Similar to Message Queue Service (20) Message Queue Service7. TCP Port#23: 文字模式 (CR/LF結尾)
傳輸規格 (Raw Data Format)
客端第一個發出的命令一定是註冊 $SUB
註冊 $SUBscriber:<用戶名稱> [Join:<群組清單>]
訂閱 QID:<佇列清單> [Since:<時分>] [Last:<筆數>]
發佈 $PUBlisher { To:<用戶清單> | QID: <佇列清單> }
Text:<訊息>
系統命令 @<命令> [ : <回覆訊息> ]
PING 閒置時會送出以確保連線正常, 若線路有問題時會產生錯誤.
BYE 客端離線前送出的簽退命令, 伺服器端會主動斷線.
GetUser 要求返回伺服器上現有的連線用戶清單.
GetQID 要求返回伺服器上現有的佇列清單.
9. 以 NetCat 來觀察傳輸狀況
$SUB:某甲 $SUB:某乙
$PUB To:某乙 Text:後天的案子可以完成嗎?
2012-06-05 10:20:10 10.10.11.150 某甲 * 後天的案子可以完成嗎?
$PUB To:某甲 Text:這兩天要加班了!!
2012-06-05 10:23:20 10.10.11.160 某乙 * 這兩天要加班了!!
接收訊息 <日期時間> <IP> <發信者> <佇列清單> <訊息>
• 同一訊息可能來自多個佇列,但只會收到一份訊息
• 佇列清單若為 ‘星號’ 表示由發信者指定用戶送出
Enter
10. DELPHI 模組及元件
使用事件反
應是否有訊
息到達, 不佔
用主執行緒
的時間
如果編譯成
元件, 使用時
直接拉到表
單上, 在專案
中就不必特
別包含這四
個模組單元
11. EMail 派送系統應用 (1)
程式1 程式N
MQS QID=MAIL
MQSMail
•統一電子郵件派送功能
•提供多附件夾檔, 可用中文檔名
•剔除最近要求重複寄送的郵件
•保留最近傳送日誌, 以供備查
12. EMail 派送系統應用 (2)
Mail := TMQMail.Create; {.}AttachList.Assign(editAttachList.Lines);
try {.}Subject := editSubject.Text;
with Mail do begin {.}Body.Assign(editBody.Lines);
//{.}CharSet := 'Big5'; end;
{.}From := editFrom.Text; MQClient1.SendMail(Mail);
{.}ToList.Assign(editToList.Lines); finally
//{.}CCList.CommaText := 'op1@example.com, op2@example.com'; Mail.Free;
//{.}BCCList.CommaText := '系統管理者<administrator@example.com>'; end;
13. EMail 派送系統應用 (2)
editFrom
1.從元件盤拉出 MQClient
1 editToList 2.檢視器中填上 QIDList
2 editAttachList 填入 MAIL
editSubject 3.檢視器中填上 UserID
editBody 填入應用程式的名稱
3
4.視窗中拉出信件所需欄位
若是在程式中給定則不用
Mail := TMQMail.Create; {.}AttachList.Assign(editAttachList.Lines);
try {.}Subject := editSubject.Text;
with Mail do begin {.}Body.Assign(editBody.Lines);
//{.}CharSet := 'Big5'; end;
{.}From := editFrom.Text; MQClient1.SendMail(Mail);
{.}ToList.Assign(editToList.Lines); finally
//{.}CCList.CommaText := 'op1@example.com, op2@example.com'; Mail.Free;
//{.}BCCList.CommaText := '系統管理者<administrator@example.com>'; end;
14. EMail 派送系統應用 (3)
var S: string;
S := 'FROM=陳瀛洲 <tony@example.com>'#13#10
+ 'TO="安台 <suezou@example.com>", "詩虔 <inchen@example.com"'#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
電子郵件不見得一定要用 TMQMail 物件,
+ '陳瀛洲'#13#10;
也可以用多行字串表示郵件資訊。
with GetMQClient do begin 每一行最前面是 "關鍵字=", 關鍵字有:
{.}QIDList := 'MAIL';
{.}UserID := 'Tony'; From, To, Cc, Bcc, Attach, Subject,
{.}SendData(S); Body (不分大小寫, Body 請放最後)
end;
15. SMS 簡訊派送系統應用 (1)
程式1 程式N
MQS QID=SMS
MQSSMS
MIOD
•統一簡訊派送功能
•剔除最近要求重複寄送的訊息
•保留最近傳送日誌, 以供備查
16. SMS 簡訊派送系統應用 (2)
// 範例一: 使用 string // 範例二: 使用 TStringList
var S: string; var List: TStringList;
List := TStringList.Create;
S := '092222222'#13#10 try
+ '測試訊息1'#13#10 List.Add('092222222');
+ '測試訊息2'#13#10; List.Add('測試訊息1');
List.Add('測試訊息2');
with GetMQClient do begin GetMQClient.QIDList := 'SMS';
{.}QIDList := 'SMS'; GetMQClient.UserID := ‘Tony’;
{.}UserID := 'Tony'; GetMQClient.Send(List.Text);
{.}SendData(S); finally
end; List.Free;
end;
傳送字串第一行為受信方電話, 若有多個
受信方請用逗號隔開。
第二行後為簡訊內容, 若含中文字時請在
80字元以內(一個中文當兩個字元)。
17. 報關運輸報價查詢系統應用 (1)
程式1 程式N
MQS QID=QTTRN Reply
Listen
QTTRNSvc 1
QTTRNSvc N
資料庫
•提供多項參數查詢所需報價單
•可同時執行多個服務複本(不同
主機), 以供大量查詢需求
開發設計期 •保留最近查詢日誌, 以供備查
18. 報關運輸報價查詢系統應用 (2)
MID := Sender.ReplyMID;
if Sender.NeedReply and (MID <> 0) then begin
try 查詢的關鍵字(括號中的英文名稱)
DoOpenDB; --> FQCmd.Data (TStringList)
try 若未指定該關鍵字則不會列入查詢的 SQL
// 取得查詢命令 FQCmd -- 為 Client 送出的物件
Sender.GetComponent(FQCmd); 有效報價單(EffectFlag): Y
生效日期(EffectDate1,EffectDate2): YYYYMMDD
FQReply.Cookie := FQCmd.Cookie; 報價日期(QTDate,QTDate2): YYYYMMDD
FQReply.Tag := FQCmd.Tag; 報價單號(QoutNo1,QuotNo2):
... 將查詢結果存入 FQReply.Data -- array of Variant 報價類別(QTType): 逗號隔開字元,
例如: 'W','D',...
MQ.ReplyMID := MID; 業績站別(AccStation): 逗號隔開字串,
MQ.SendData(FQReply); // 回覆結果給指定的 MessageID 例如:'AJ100','AF100',...
finally 併車/專車(VIP): Y 或 N
... 清理工作 ... 往返報價(ReturnFlag): Y
end; 客戶代碼(Client):
TMQClient.OnRecvMsg 事件 負責業務(Sales):
except
... 錯誤處理 ... 主要處理邏輯 費用代碼(ChgCD):
end; 起站代碼(SiteFrom):
end else begin 迄站代碼(SiteTo):
LogMsg('接收錯誤> 非 Reply 訊息, 不予處理.'); 車種代碼(CarType):
end; 車噸代碼(CarWeight):
// Listen 模式收到要求訊息後會先 detach 該 Queue (此時 TCP/IP 並未斷線),
// 處理完後必須執行 SignOn, 這時 MQS 服務才會再次 attach 指定的 Queue,
// 若有新的要求訊息, 此後 MQS 才會將之送過來. QTTRNSvc 程式
MQ.SignOn;
19. 報關運輸報價查詢系統應用 (3)
QTTRN 客端查詢程式- Demo/Project4.dpr 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;
21. MQS 訊息服務系統設定檔(1)
[Global]
;;每多少毫秒更新畫面一次: 100~10,000 ms, 預設 1 秒 ;;Message Queue Service 的 TCP 服務端口: 預設值為 23
;TimeInterval=1000 ServerPort=23
;;以下兩個值請採用質數以減少碰撞處理, ;;每一訊息允許最大長度(數字後可加 K,M), 預設 2M
;;可能會影響即時的反應效能 ;;註: 這是指 TidTCPClient 的 MaxLineLength
;; MaxMsgSize=15M
;;Queue 多久儲存一次: 10~3600 秒, 預設 37 秒
;SaveQueueSeconds=37 ;;系統日誌每行訊息最大長度: 預設為 4000 字元
;; MaxLogLineLength=1000
;;多久送出一次 @PING: 10~3600 秒, 預設 57 秒
;PollingClientSeconds=57 ;;儲存 MessageID (檔案:MQS.MsgID) 間隔: 10~3600 秒
;SaveMsgIDSeconds=600
;;預設編輯器
;Editor=notepad ;;Reply 訊息最多保留時間(秒), 逾時則將之刪除
;ReplyTimeoutSeconds=7200
;;Log 目錄所在, 可用下列指期定日期每日自動切換
;;若未指定則不會自行切換目錄
;; %d: 01~31 (Day of Month)
;; %w: 0~6 (Sun:0, Mon~Sat:1~6)
MQS.INI
;; %m: 01~12 (Month)
;; %y: yyyy (Year) 主程式設定檔, 僅開始執
;LogRotatePath=Log.%y%m%d
;LogRotatePath=LogsW%w
LogRotatePath=Logs%d
行時讀取一次, 若有修改
;;Queue 暫存目錄, 預設無, 同執行程式的目錄 必須重啟程式才會生效
QueuePath=Queues
22. MQS 訊息服務系統設定檔(2)
[Group] ;[Q_Default]
mis=suezou,inchen,hsya,jmju,cwfeng,jhliang,srtsai ;KSize=32
op=angellee,grace,sammi,shwang ; 每一訊息前要額外增加4個字元(長度)
tsmcImport=angellee,grace,sammi,shwang ; 訊息格式: <Timestamp:8> <MID:4> <SID:4>
tsmc=mcchen,chinling,ychuang,ruyeh,nikyang,yajyang ; <IP:IPSize> <UserID:IDSize> <Text>
tsmc=yywang,yjlu,hjchang,may_shu ;
ftp=ftp_FTP01,ftp_example2000,ftp_example-ftp ;Public=True/Yes/1 或 False/No/0, 預設為 True
; 是否允許註冊時指定本佇列 (MsgID=QID)
;User=QueueList,@GroupList ;
[User] ;Type=Share 或 Round-Robin, 預設為 Share
;angellee=@op,@tsmcImport ; Share: 訊息會同時送給此 Queue 所有的 Users
;grace=@op,@tsmcImport ; Round-Robin: 訊息每次輪流給予一個 User
tonychen=@mis ;
;Wait=True/Yes/1 或 False/No/0, 預設為 False
[Queue] ; 發佈訊息時若無人等待中, 則先暫存於 Wait Queue
List=SYSLOG,MAIL,SMS,FTP ;
KSize=16 ;Count=500
Count=100 ; 最多保留 500 個訊息, 若為零則不檢查
Timeout=0 ; 若 Count 和 Timeout 兩者皆為零時, 則視同
Round-Robin=MAIL,SMS ; Count=100, 即只保留最近 100 個訊息
Wait=MAIL,SMS ;
;啟用內定服務 SysLog 時請指定其 QID ;Timeout=1800
SysLog=SYSLOG ; 保留最近 1800 秒內的訊息, 若為零則不檢查
;
;Users=@Group,User,...
MQS-Queue.ini ; 指定預設給那些 Users 或 @群組