程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> WebSphere >> 不可或缺的十種WebSphere MQ SupportPac

不可或缺的十種WebSphere MQ SupportPac

編輯:WebSphere

SupportPac 是什麼?

SupportPac 是補充 IBM WebSphere MQ 產品家族中各種產品 的增件。面向 WebSphere MQ 的 SupportPac 包括產品擴展、用戶和管理工具、出口程序 (exits)等等。許多最新的 WebSphere MQ 特性最初都是以 SupportPac 的形式出現的,再根 據用戶反饋進行細化和改進,最終整合到基本產品之中。Performance Report SupportPac 會 為每個新產品版本重新創建,而其他許多 SupportPac 則會沿用十多年。

簡而言之, SupportPac 的存在是為了幫助您充分利用 IBM WebSphere 軟件。SupportPac 有數百種之多, 在一篇文章中評論所有這些內容是不可能的,因而我將為您介紹我最依賴的幾種 SupportPac:

IH03: WebSphere Message Broker V6-Message display, test & performance utilities (RFHutil)

MA01: WebSphere MQ - Q Program

MA0W: WebSphere MQ API Trace

MO71: WebSphere MQ for Windows - GUI Administrator (mqmon)

MO72: MQSC Client for WebSphere MQ

MS81: WebSphere MQ internet pass- thru (MQIPT)

MH03: WebSphere MQ SSL Configuration Checker

MO04: WebSphere MQ SSL Wizard

MS03: WebSphere MQ - Save Queue Manager object definitions using PCFs (saveqmgr)

MS0P: WebSphere MQ Explorer - Configuration and Display Extension Plug-ins

本文結尾處的 參考資料 部分列出了上述(及其他所 有)SupportPac 的鏈接。

請使用下方的注釋框為本文添加您喜愛的 SupportPac。

1. IH03: WebSphere Message Broker V6-Message display, test & performance utilities (RFHutil)

此 SupportPac 位於 SupportPacs 頁面的 Message Broker 部 分中。由於其包含的可執行模塊 RFHUtil 更為知名,因而如果您不知道在哪裡查找,要找到此 實用工具極為困難。

IH03 包含大量程序,但這組程序中最閃耀的明星就是 RFHUtil 和 客戶端版本的 RFHUtilc。這個 GUI 實用工具學習起來比較困難,但值得為之努力。當然,它 也執行一些基本操作,例如將數據從文件移動到隊列,或從隊列移動到文件。但除此之外,它 也具有多個標簽對話框,顯示 WebSphere MQ API 中可用的所有參數和選項。需要發送或解析 RFH 報頭?檢查這裡。需要快速測試 pub/sub 的工具。在這裡也可以找到。需要設置或檢查報 告選項?確認選項?Reply-to 字段、綁定選項、持久化、過期?一切都能實現!

對於程序員來說,在需要測試時、在接口另一端的程序不可用時,這種實用工具是極為有用 的。通常,需要一組特定的消息選項或需要發送非簡單字符串的消息。RFHUtil 可設置這些選 項,或使用二進制負荷或其他任何 JMS 格式發送消息。

管理員可以使用 RFHUtil,在 診斷網絡中異常行為時驗證消息報頭的內容和負荷。例如,我最近使用 RFHUtil 推斷出為什麼 一個應用程序無法接收到確認消息。應用程序生成的請求消息請求 Confirmation on Delivery ,而非 Confirmation on Arrival。由於這些類型的確認需要不同的授權,因而所需的確認消 息未能生成。RFHUtil 使我能夠在短短幾分鐘內查明問題所在。

在 IH03 內還有其他許 多實用工具可以在隊列管理器或代理商生成負載,我將來一定也會考慮嘗試使用其他一些工具 。

2. MA01: WebSphere MQ - Q program

在 SupportPacs MA01 乏味的一行摘要 背後,隱藏著多種頂級的 “廚房器具”。許多不知內情的人在讀到 “這個 SupportPac 包含一個簡單的管道程序 (Q),它接收來自一個源的消息,並輸出給目標” 這句話時,都會打上一個哈欠,卻沒有想到 Q 可以切片、切丁、切絲、切碎、削皮、研磨、搾 汁,或者切條。

Q 的強大力量源於其管道命令程序的設計。(《星際迷航》的擁護者們 主張 Q 的力量源於 Q 連續體,請這些人在這裡采納我的意見)。也許您還不熟悉管道程序的 概念,其概念就是在一個 “管道” 中連接兩個或多個程序,第一個程序的輸出作 為下一個程序的輸入。在一個管道中連接兩個或三個簡單的程序,您就可以建立有用的程序, 如果采用其他方法,將需要大量編碼工作。

例如,您可將任何程序的輸出傳送到 Q 中 ,創建 MQ 消息,將消息發送到遠程隊列管理器,再使用另外一個 Q 實例將消息轉回一個文件 。但與需要完整文件的文件傳輸程序不同,管道方法可在文件中的各行被寫下時接收這些行。 例如,一個生成日志文件的程序可通過管道與 Q 連接,使日志記錄實時移入遠程服務器。有了 管道方法,功能只受您的想象力的限制。

但即便您不需要管道功能,Q 也有其他很多優勢。基本的命令行選項可將消息轉儲為多種格 式,按需使用破壞性讀取或浏覽。Message GET 選項支持按照特定的消息 ID 或關聯 ID 進行 選擇,在刪除有害消息或掃描查找測試數據集中是否如期生成特定消息時,這是十分方便的。 我們經常會遇到跨兩個隊列映射消息的需要。這十分簡單:只要指定多個輸出隊列,將每個傳 入消息傳遞給各輸出隊列即可。–h 選項作為過濾器,支持按任意隨機字符串進行消息選 擇。您是否希望成批生成測試消息?Q 也能為您實現這種功能。

3. MA0W: WebSphere MQ API Trace

如果您認為 WebSphere MQ 的調優和故障排除就像巫術,那麼 SupportPac MA0W 就是您進入巫師學校的邀請函。MA0W 與 MQ Trace 極為接近,但提供了更多 有用的選項和人類可讀的輸出。

調試中的一大挑戰就是應用程序和 WebSphere MQ API 之間往往存在多層系統代碼。例如,一個 Java™ EE 服務器提供許多與應用程序控制之 外的 WebSphere MQ 交互的功能。盡管服務器公開了影響行為的配置,但實際代碼不可用,因 而有時必須設法進行推論,而不是直觀的檢查。MA0W 為您顯示每個 API 調用,附帶上下文狀 態,從而使您能夠清晰地理解代碼。

我最近一次使用 MA0W 是設法推斷出我所測試的一組有害消息為什麼未被重新排隊。有害消 息就是出於某些原因無法被處理的消息,應用程序在同步點讀取了這樣的消息之後,又會將其 恢復到隊列。隊列中的下一個 GET 將檢索到相同的消息。為了避免無限循環,IBM 的 JMS 類 會檢查消息的恢復計數以及輸入隊列的恢復阈值和恢復隊列屬性。只要一個恢復計數超出隊列 的恢復阈值,JMS 類就會為恢復隊列重新排隊。這會消除有害消息,使應用程序繼續處理隊列 中的其他消息。

由於有害消息處理內置於 JMS 類中,因而沒有代碼能夠檢查應用程序 在何時未能如期執行。我對一組有害消息進行測試時,我注意到再有害消息堆疊在一起時,恢 復隊列的深度增加了,但在停止測試程序時,所有消息都回到了輸入隊列。這絕不是我所期待 的,我沒有執行任何會導致消息最終進入中斷隊列的操作。

在使用 MA0W 跟蹤 API 調 用後,一切都明確了。在正常處理中,有害消息極為稀有。通常情況下,在每條有害消息之後 都有一條完全有效的消息在等待處理。但我的測試數據集完全由有害消息組成。API 跟蹤表明 ,有害消息在同步點重新排隊,並未被提交。工作單元隨後擴展為包含下一條消息,那也是在 同步點讀取的。操作就這樣繼續下去,直至所有消息都回滾到輸入隊列。得到了這樣的信息之 後,我在測試集的末尾添加了一條良好的消息。這條良好的信息終於被提交給程序,隨後調用 了 COMMIT,使所有有害消息都進入恢復隊列。

在我的轶事集中,我提到了應用程序 “意料之外的行為”,而當時我並未真正理解系統的工作方式。在 MA0W 展示了 JMS 類所使用的 API 調用後,我才意識到所看到的行為都是正常和意料之中的。

這些 年來,我多次使用 MA0W 成功診斷了多種平台上的一些難題。由於它能截取隊列管理器本身內 的 API 調用,因而 MA0W 與應用程序所用的編程語言無關,實際上也與應用程序是本地的還是 遠程連接的也沒有關系。在其眾多選項中,對於忙碌、共享的隊列管理器來說,最有價值的莫 過於跟蹤特定隊列或特定進程的能力。強烈推薦您將 MA0W 加入您的 WebSphere MQ 工具箱。

4. MO71: WebSphere MQ for Windows - GUI Administrator (mqmon)

這個 SupportPac 也稱為 MO71,可執行名稱為 mqmon,這是一種用於 WebSphere MQ 的 Windows® GUI 管理工具。由於采用了 C 編譯代碼,因而小、輕、快。要運行 mqmon,只 需將其解壓到一個文件夾中,再雙擊可執行文件即可。這將使您立即能夠訪問任意本地隊列管 理器,如果安裝了 WebSphere MQ 客戶端,還可以訪問任意遠程隊列管理器。

關於 mqmon,我認為最有用的就是它能為每個函數打開一個專用的新窗口。盡管它有可能打開過多的 窗口,使您的桌面一片混亂,但我發現 WebSphere MQ Explorer 的單任務范例過於局限。如果 設置了 WebSphere MQ Explorer for Workbench 模式,即可打開多個窗口,但每個窗口都是一 個完整版本的 WebSphere MQ Explorer。利用 mqmon,可以打開僅顯示一個隊列的一個窗口, 也可以僅顯示隊列的一部分。此外,在我使用一個窗口設置觸發發送隊列時.也可以打開另一個 通道狀態窗口。在 mqmon 中,顯示對象列表的窗口中的每個對象顯示為一行,列可自定義,表 示對象屬性。雙擊任意對象都能向下鑽取到該對象的細節,通常有多個與可用對象類型相關的 選項。若您獲得了恰當的授權,單擊任意值即可輕松更改該值。

當然,mqmon 在特性方 面毫不懈怠。任何帶有可設置屬性或狀態的對象在 mqmon 中都有相應的對話框。如果您偏愛命 令行,mqmon 也有一個對話框,可直接輸入 runmqsc 命令。mqmon 有一個網絡視圖,顯示所有 隊列管理器的狀態概覽,還有一個輕量級的監控平台。您甚至可以實現一個 HTTP 偵聽器並連 接到 mqmon,使用浏覽器執行查詢和管理任務。

我使用 mqmon 的一個用途就是在遇到 無法連接的非 Java 應用程序時測試 SSL 配置。盡管 Java 應用程序,如 WebSphere MQ Explorer 使用 Java keystore,但其他平台使用的是 Key Database 格式的 keystore。使用 mqmon,我就能夠使用與應用程序所用相同的 keystore 文件測試 SSL 連接。這使我能夠隔離 keystore,驗證問題的起因,並排除問題。

MO71 還有其他一些未在 WebSphere MQ Explorer 中出現的特性,例如將一個文件載入隊列或將一個隊列載入文件的能力,請下載一份 拷貝,親身體驗這些特性。

5. MO72: MQSC Client for WebSphere MQ

這個 SupportPac 的說明也是輕描淡寫。其說明只有短短三句話,如下:

  MQSC Client for WebSphere MQ 允許使用 MQSC 命令,可直接連接到隊列管理器, 也可通過客戶端連接連接到隊列管理器。它還提供了多種格式化選項,用於顯示命令的結果。 也可用於顯示或修改客戶端通道定義表。

在研討會上討論這個 SupportPac 時,許多人詢問為什麼不使用 runmqsc 實現相同的功能。讓我們再看看這三句話 的說明,來回答這個問題。

首先,可以使用客戶端連接在隊列管理器上執行腳本命令。 這允許通過單獨一個位置在整個 WebSphere MQ 網絡上運行腳本操作。

例如,我使用 MO72 實現遵從性報告。首先編寫一個腳本,遍歷一組隊列管理器,使用 MO72 收集隊列管理器 的安全性設置的細節,並將其與目標基准進行比較。隨後,腳本大約每周一次地通過電子郵件 發送一份遵從性報告,使我能夠了解網絡上的哪些隊列管理器存在需要關注的配置問題。

我使用相同的框架編寫了可在整個網絡中實現的腳本,尋找特定 CONNAME 的所有實例 ,或執行自動監測任務,如故障轉移到災難恢復站點。

但支持此類自動化的不僅僅是使 用客戶端連接的能力。SupportPac 說明中第二句話提到了輸出的 “多種格式化選項 ”。內置 runmqsc 工具的輸出以人類可讀為目標,以兩列的格式打印,每個對象占用多 行。使用腳本解析這樣的輸出需要大量字符串操作。例如,嘗試識別 CONNAME 中帶有 “localhost” 的通道就要求腳本從各行提取屬性,搜索 CONNAME 屬性,並對通道 名稱屬性的每個實例執行控制中斷處理。

另一方面,MO71 可生成將每個對象的所有屬 性顯示在一行中的輸出。同樣的處理現可簡化為使用 grep 識別 CONNAME 中為 “localhost” 的所有通道,隨後從剩余的行中提取通道名稱。MO72 的格式化功能 使腳本的編寫更加輕松、運行更加迅速。

SupportPac 說明的最後一句話幾乎是以事後 諸葛的方式提到,MO72 可用於生成客戶端通道定義表(CCDT)。生成 CCDT 的教科書方法是使 用 runmqsc,在正在運行的隊列管理器上定義多個 CLNTCONN 通道,隨後分發所得到的 AMQCHL.TAB 文件。大多數人不知道,這種方法不會在所得到的文件內進行任何 “垃圾收 集” 處理。刪除一個條目時,會在文件內留下一個空洞。這或許可以重用,但永遠不會 被壓縮。因而,使用這種管理方式時,CCDT 文件會不斷增大。MO71 能夠在每次運行時從零開 始生成一個新文件。結果使您總是能夠獲得最小的 CCDT 文件,僅包含您需要的那組定義。

更引人注目的是,MO72 不需要運行中的隊列管理器生成 CCDT 文件。我過去參與過的 一個監測項目曾經使用一些 CGI 腳本和一個 Apache Web 服務器構建 Web 頁面,提供可用隊 列管理器的列表。當管理員選擇感興趣的隊列管理器,並單擊 “提交” 按鈕時, CGI 腳本會按需生成一個 CCDT 文件,並將其下載到該管理員的浏覽器中。

當然,您可輕松通過手動駕馭 MO72,也可以使用簡單的 shell 腳本。由於 CCDT 是一種編 譯成果,因而應將源定義包含到項目的變更管理系統之中。據我所知,有一家公司采用了這種 方法,他們使用 ant 腳本生成 CCDT,將此作為其應用程序構建的一部分。此類自動化會得到 更好的一致性、可重復性和更少的失誤。

6. MS81: WebSphere MQ internet pass-thru (MQIPT)

MQIPT 中的 “IPT” 代表 “互聯網直通”。這個 SupportPac 在 DMZ 中為 WebSphere MQ 通道提供了一個控制點。一個 MQIPT 實例可管理來自 多個外部業務合作伙伴的連接,並將其發送到任意數量的內部隊列管理器。每個連接路徑都是 獨立管理、獨立控制的。

MQIPT 還可使穿越防火牆更為輕松,它能提供 HTTP 或 HTTPS 內的 WebSpher MQ 通道隧道協議。通常,兩家業務合作伙伴各自在其 DMZ 中設置一個 MQIPT 節點,這樣就有一個 MQIPT 節點隊位於兩個隊列管理器之間,兩個防火牆位於中央。隊列管理 器僅看正常的 WebSphere MQ 通道,防火牆僅看到 HTTP 或 HTTPS 流量。

我傾向於在 DMZ 中使用 MQIPT,而不是設立完整的隊列管理器。理由就是 MQIPT 不會將任 何數據排隊到磁盤中,因而在出現通道故障時,DMZ 中不會出現數據堆積的現象。作為 WebSphere MQ 管理員,我也十分欣賞在連接請求抵達隊列管理器之前啟用或禁用外部訪問權限 的能力。同樣的結果也可通過關閉防火牆上的端口來實現,但那需要向另外一個獨立的團隊發 出申請。通過 MQIPT,MQ 管理員即可直接管理該訪問。

在 MQIPT 參與 SSL 連接時, 它會向用戶編寫的退出程序提供一些證書詳情。MQIPT 的更大優勢在於它能比 WebSphere MQ 認證更多字段,因而,舉例來說,如果您需要檢查頒發機構的標識名,即可在 MQIPT 退出程序 中實現。

MQIPT 是一種傑出的工具,可幫助保護和控制 WebSphere MQ 網絡上的外部連 接。請務必注意,它能增強您在隊列管理器上執行的保護工作 —— 但不是取代。

7. MH03: WebSphere MQ SSL Configuration Checker

這個 SupportPac 將檢查 一個隊列管理器的 SSL 配置設置,也可以選擇為客戶端進行檢查,並報告所發現的任何問題。 無需復雜的安裝,只需將獨立可執行文件拖放到隊列管理器所在主機上,再運行即可。程序已 為 AIX®、HP-UX、Linux®、Solaris™ 和 Windows 編譯。

程序發現問題時,將打印一份詳盡的報告,其中通常包含關於問題的簡短說明、一個提供問 題具體描述的 “建議” 部分、可行解決方法建議。

由於 MH03 是一個獨立 的可執行文件,因而設置和運行十分輕松。MH03 是我最經常使用的一種 SupportPac,而原因 之一就是我依靠它進行遠程支持。在現場時,我通常要求客戶手動執行 SSL 驗證,以便更好地 理解所有組件的交互方式。但在通過電話提供支持時,重點往往在於解決問題的速度。MH03 能 夠達到與手動驗證完全相同的效果,但速度更快,也不會有任何遺漏。如果您正在 WebSphere MQ 網絡中使用 SSL(如今幾乎沒有人不這樣做),那麼您就需要 MH03。

8. MO04: WebSphere MQ SSL Wizard

MO04 SSL Wizard 是我 “最常用” 的 SupportPac 之一,而實際上使用的次數也並非很多。近來,我使用它的方法就是將它介紹給剛 剛開始學習 WebSphere MQ SSL 的新手,使他們能夠從中學習經驗。

MO04 是一種基於 Java 的 GUI,能指導您完成收集通過支持 SSL 的通道連接兩個隊列管理器(或一個客戶端和 一個隊列管理器)的需求的尋訪過程。收集到 SSL 連接雙方的詳細信息後,SSL Wizard 就會 生成一個極為全面流程,包括敘述性說明和必要的命令。命令包括隊列管理器名稱、通道名稱 和證書細節等數據的實際值,旨在按原樣運行。

它所生成的輸出對於理解流程和解答如 下問題大有裨益,例如:我是否要導出或提取證書?我要提出的惟一的警告就是:它所生成的 部分命令包含語法錯誤。但該程序的輸出在其他方面極為有用和完善,完全可以抵消這種微不 足道的瑕疵。

9. MS03: WebSphere MQ - Save Queue Manager object definitions using PCFs (saveqmgr)

一直以來,我最常用的 SupportPac 都是 MS03,通常簡稱為 saveqmgr。提到備份隊列管理器,存在兩種學派。有些人傾向於備份包含隊列管理器配置的文 件系統,而其他一些人則備份關於配置的元數據。我屬於第二組。

在文件系統級備份 WebSphere MQ 時,備份包含當時隊列管理器上存在的所有消息。在恢復隊列管理器時,所有這 些消息都會進入隊列。除非上游和下游的所有相關程序與數據庫都恢復到同一個時間點,否則 這樣的恢復會將系統置於不可知的狀態,必須調整到一個已知同步點,才能避免出現重復或者 遺漏的事務。

這就假設隊列管理器可首先恢復,但這是沒有保證的。許多企業都在隊列 管理器運行時進行文件系統備份。結果就是隊列文件的備份與日志文件的備份存在些許的不同 步現象,可能會有一個或多個文件被破壞。

出於這些原因,我更傾向於備份隊列管理器 元數據。其中包括對象定義、授權配置文件、SLL keystore、ini 文件和任何退出目錄的內容 。saveqmgr 程序可為所有版本的 WebSphere MQ 捕捉隊列管理器對象定義。對於版本 6.0 及 更高版本,saveqmgr 也能捕捉授權配置文件。此後,若有必要恢復隊列管理器,可以重新創建 一個空的隊列管理器,因而無需協調那些無意中隨隊列管理器一起恢復的數日乃至數周前的陳 舊信息。

與 MO72 相似,saveqmgr 也具有一個我十分常用的客戶端版本。當然,這個 版本就是 saveqmgrc。我已經看到了許多使用 saveqmgr 在本地捕捉隊列管理器配置數據的案 例。但對於在磁盤或服務器崩潰後有用的數據,必須存儲在另外一台服務器上。我熱愛腳本和 自動化,因而我的解決方法就是將 saveqmgrc 設置在中央服務器上(可以是 MO72 所在的服務 器),使用腳本遍歷所有隊列管理器,收集對象定義和授權。

通常情況下,我將輸出文 件存儲在這個中央服務器上,使用樹形結構,為每個隊列管理器使用一個獨立的目錄。這種做 法的優勢之一就是使之成為平面文件數據庫,易於通過簡單的 UNIX® find 命令或某些輕 量級腳本搜索。這就使您更容易解答 “這個隊列將在何時消失?” 這樣的問題。

10. MS0P: WebSphere MQ Explorer - Configuration and Display Extension Plug- ins

事件消息是 WebSphere MQ 故障排除中的高度機密之一。在需要調試授權問題時, 我會啟用授權事件,重建錯誤。幾年前,我會使用 C 頭文件的副本和我信任的十六進制計算器 ,逐個字段地解析事件消息。當然,這是一項冗長的工作。但事件消息能告訴我生成錯誤的用 戶 ID、失敗的 API 調用、API 調用的目標對象以及所使用的選項。通過一條事件消息診斷授 權問題的能力使手動解析十六進制字段的麻煩顯得微不足道。

至少在 MS0P 發布之前, 都是如此。MS0P 將解析授權或其他任何類型的事件消息,將其解析為人類可讀的文本。多虧這 個 SupportPac,我的十六進制計算器終於圓滿退役。我也變得如此懶惰。我甚至不確定是否還 記得如何手動解析事件消息。

即便這個 SupportPac 只能完成這項任務,也值得下載。 而實際上,事情還不僅如此。這個插件也支持跟蹤路由功能,可以告訴您消息經過了哪些隊列 管理器。此外還能以圖形的格式顯示隊列活動。

這個工具包中的另外一個插件提供了執 行 WebSphere MQ 服務器的遠程管理的能力。該插件可管理 Windows、UNIX 和 Linux 系統, 可以啟動或停止隊列管理器,並執行其他通常被視為 “僅能通過命令行執行” 的 任務。

第三個插件能夠將隊列管理器對象定義保存為逗號分隔值(CSV)格式。這使對 象定義能夠被 Microsoft Excel 處理,也可輕松載入數據庫。

最後,該 SupportPac 包含兩個極為有用的實用工具程序。mqidcode 實用工具可將十進制 或十六進制數值轉換為人類可讀的內容。例如,您可能擁有一份跟蹤記錄的輸出,需要了解 GET 操作是否制定了 SYNCPOINT。將 Open Options 字段的數值傳遞給 mqidcode 即可獲得答 案,無需使用 C 頭文件和計算器。另外一個實用工具是 qtune,用於公開隊列緩沖區設置,使 您能夠查詢和設置它們。在大容量環境中,隊列管理器必須調優為最優性能,因此通常需要更 改隊列緩沖區的默認設置。緩沖區被調優之後,就能夠通過查詢它來驗證調優效果或捕捉備份 中的配置,這十分有幫助。但至今為止,尚無查詢實際設置的簡便方法。除了簡化查詢之外, qtune 還可簡化更改值的過程。

結束語

我希望這份關於我最喜愛的 SupportPac 的指南能鼓勵您訪問 SupportPac 網站,試用一些新工具。SupportPac 有數百種之多,沒有任 何一篇文章能夠全面涵蓋所有這些內容,也不可能有任何兩個人的偏愛列表完全相同。我是否 忽略了您喜愛的 SupportPac?請使用下面的評論表單,推薦您認為最出色的 SupportPac,請 務必說明您選擇它的原因。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved