SlideShare a Scribd company logo
訊息服務系統
Message Queue Service
       (MQS)

                  陳瀛洲 製作
目的: 做為應用程式的訊息交換中心
      就像是個 HUB
架構示意圖
內部模組關聯圖
TCP Port#23: 文字模式 (CR/LF結尾)
傳輸規格             (Raw Data Format)


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

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


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

系統命令 @<命令> [ : <回覆訊息> ]
       PING      閒置時會送出以確保連線正常, 若線路有問題時會產生錯誤.
       BYE       客端離線前送出的簽退命令, 伺服器端會主動斷線.
       GetUser   要求返回伺服器上現有的連線用戶清單.
       GetQID    要求返回伺服器上現有的佇列清單.
以 NetCat 來觀察傳輸狀況
以 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
DELPHI 模組及元件
        使用事件反
        應是否有訊
        息到達, 不佔
        用主執行緒
        的時間


        如果編譯成
        元件, 使用時
        直接拉到表
        單上, 在專案
        中就不必特
        別包含這四
        個模組單元
EMail 派送系統應用 (1)
         程式1        程式N

           MQS QID=MAIL

        MQSMail


        •統一電子郵件派送功能
        •提供多附件夾檔, 可用中文檔名
        •剔除最近要求重複寄送的郵件
        •保留最近傳送日誌, 以供備查
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;
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;
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;
SMS 簡訊派送系統應用 (1)
         程式1       程式N

          MQS QID=SMS

        MQSSMS

                   MIOD
        •統一簡訊派送功能
        •剔除最近要求重複寄送的訊息
        •保留最近傳送日誌, 以供備查
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字元以內(一個中文當兩個字元)。
報關運輸報價查詢系統應用 (1)
          程式1          程式N

         MQS QID=QTTRN Reply
             Listen

        QTTRNSvc 1

          QTTRNSvc N
                       資料庫
        •提供多項參數查詢所需報價單
        •可同時執行多個服務複本(不同
        主機), 以供大量查詢需求
開發設計期   •保留最近查詢日誌, 以供備查
報關運輸報價查詢系統應用 (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;
報關運輸報價查詢系統應用 (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;
MQS 訊息服務系統
       佇列及用戶特性可動態修
       改按【重載Dispatcher】
       即可生效
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
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 或 @群組
Message Queue Service

More Related Content

Similar to Message Queue Service

twMVC#27 | C# 7.0 新功能介紹
twMVC#27 | C# 7.0 新功能介紹twMVC#27 | C# 7.0 新功能介紹
twMVC#27 | C# 7.0 新功能介紹
twMVC
 
系统邮件实战技巧
系统邮件实战技巧系统邮件实战技巧
系统邮件实战技巧thinkinlamp
 
系统邮件实战技巧
系统邮件实战技巧系统邮件实战技巧
系统邮件实战技巧samon127
 
Chapter 3 basic syntax and operator
Chapter 3  basic syntax and operatorChapter 3  basic syntax and operator
Chapter 3 basic syntax and operator
hhliu
 
AWS Lambda Multi-Cloud Practices
AWS Lambda Multi-Cloud PracticesAWS Lambda Multi-Cloud Practices
AWS Lambda Multi-Cloud Practices
康志強 大人
 
希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范Hongjian Wang
 
Java技术讲座 网络编程
Java技术讲座 网络编程Java技术讲座 网络编程
Java技术讲座 网络编程
xujie
 
181201_CoAP_coding365
181201_CoAP_coding365181201_CoAP_coding365
181201_CoAP_coding365
Peter Yi
 
透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps
Eric ShangKuan
 
Static server介绍
Static server介绍Static server介绍
Static server介绍
sun jamie
 
Glider
GliderGlider
Glider
windyrobin
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
建興 王
 
[ZigBee 嵌入式系統] ZigBee Architecture 與 TI Z-Stack Firmware
[ZigBee 嵌入式系統] ZigBee Architecture 與 TI Z-Stack Firmware[ZigBee 嵌入式系統] ZigBee Architecture 與 TI Z-Stack Firmware
[ZigBee 嵌入式系統] ZigBee Architecture 與 TI Z-Stack Firmware
Simen Li
 
ZeroMQ简介
ZeroMQ简介ZeroMQ简介
ZeroMQ简介
Xu Wang
 
PHP 應用之一 socket funion : 偽 WEB Server
PHP 應用之一 socket funion : 偽 WEB ServerPHP 應用之一 socket funion : 偽 WEB Server
PHP 應用之一 socket funion : 偽 WEB Server
志賢 黃
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt锐 张
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗
乐群 陈
 
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態shademoon
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
Ho Kim
 

Similar to Message Queue Service (20)

I os 05
I os 05I os 05
I os 05
 
twMVC#27 | C# 7.0 新功能介紹
twMVC#27 | C# 7.0 新功能介紹twMVC#27 | C# 7.0 新功能介紹
twMVC#27 | C# 7.0 新功能介紹
 
系统邮件实战技巧
系统邮件实战技巧系统邮件实战技巧
系统邮件实战技巧
 
系统邮件实战技巧
系统邮件实战技巧系统邮件实战技巧
系统邮件实战技巧
 
Chapter 3 basic syntax and operator
Chapter 3  basic syntax and operatorChapter 3  basic syntax and operator
Chapter 3 basic syntax and operator
 
AWS Lambda Multi-Cloud Practices
AWS Lambda Multi-Cloud PracticesAWS Lambda Multi-Cloud Practices
AWS Lambda Multi-Cloud Practices
 
希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范
 
Java技术讲座 网络编程
Java技术讲座 网络编程Java技术讲座 网络编程
Java技术讲座 网络编程
 
181201_CoAP_coding365
181201_CoAP_coding365181201_CoAP_coding365
181201_CoAP_coding365
 
透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps
 
Static server介绍
Static server介绍Static server介绍
Static server介绍
 
Glider
GliderGlider
Glider
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
 
[ZigBee 嵌入式系統] ZigBee Architecture 與 TI Z-Stack Firmware
[ZigBee 嵌入式系統] ZigBee Architecture 與 TI Z-Stack Firmware[ZigBee 嵌入式系統] ZigBee Architecture 與 TI Z-Stack Firmware
[ZigBee 嵌入式系統] ZigBee Architecture 與 TI Z-Stack Firmware
 
ZeroMQ简介
ZeroMQ简介ZeroMQ简介
ZeroMQ简介
 
PHP 應用之一 socket funion : 偽 WEB Server
PHP 應用之一 socket funion : 偽 WEB ServerPHP 應用之一 socket funion : 偽 WEB Server
PHP 應用之一 socket funion : 偽 WEB Server
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗
 
09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態09 結構、聯合、列舉與定義型態
09 結構、聯合、列舉與定義型態
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
 

Message Queue Service

  • 5.
  • 6.
  • 7. 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;
  • 20. MQS 訊息服務系統 佇列及用戶特性可動態修 改按【重載Dispatcher】 即可生效
  • 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 或 @群組