IWebMessage 接口
CWorkerThread 的實現之一是一個調用組件方法的類。這個名為 CWorkerThreadAssembly 的類使用 IWebMessage 接口來定義服務和組件之間的約定。
與當前版本的 Microsoft Visual Studio? 不同,C# 接口可以在任何語言中顯式定義,而不需要創建和編譯 IDL 文件。C# IWebMessage 接口的定義如下:
public interface IWebMessage
{
WebMessageReturn Process(string sMessageLabel, string sMessageBody, int iAPPSpecific);
void Release();
}
ATL 代碼中的 Process 方法是為處理消息而指定的。Process 方法的返回代碼定義為枚舉類型 WebMessageReturn:
public enum WebMessageReturn
{
ReturnGood,
ReturnBad,
ReturnAbort
}
枚舉的定義如下:Good 表示繼續處理,Bad 表示將消息寫入錯誤隊列,Abort 表示終止處理。Release 方法為服務提供了輕松清除類實例的途徑。因為僅在垃圾回收的過程中才調用類實例的析構函數,所以確保所有占用昂貴資源(例如數據庫連接)的類都有一個能夠在析構之前被調用的方法,用來釋放這些資源,這是一種非常好的構思。
名稱空間
在這裡先簡單介紹一下名稱空間。名稱空間允許在內部和外部表示中將應用程序組織成為邏輯元素。服務內的所有代碼都包含在 MSDNMessageService.Service 名稱空間內。盡管服務代碼包含在若干文件中,但是由於它們包含在同一名稱空間中,因此用戶不需要引用其他文件。
由於 IWebMessage 接口包含在 MSDNMessageService.Interface 名稱空間中,因此使用此接口的線程類具有一個接口名稱空間。
服務類
應用程序的目的是監視和處理消息隊列,每一隊列在收到消息時都執行不同的進程。應用程序是作為 Windows 服務來實現的。
ServiceBase 類
如前所述,服務的基本結構是從 ServiceBase 繼承的類。重要的方法包括 OnStart、OnStop、OnPause 和 OnContinue,每一個替代方法都與一個服務控制操作直接對應。OnStart 方法的目的是創建 CWorker 對象,而 CWorker 類又創建 CWorkerThread 對象,然後在該對象中創建執行服務工作的線程。
服務的運行時配置(以及 CWorker 和 CWorkerThread 對象的屬性)是在基於 XML 的配置文件中維護的。它的名稱與創建的 .exe 文件相同,但帶有一個 .cfg 後綴。配置示例如下:
<?XML version="1.0"?>
<configuration>
<ProcessList>
<ProcessDefinition
ProcessName="Worker1"
ProcessDesc="Message Worker with 2 Threads"
ProcessType="APPSpecific"
ProcessThreads="2"
InputQueue=".\private$\test_load1"
ErrorQueue=".\private$\test_error">
<OutputList>
<OutputDefinition OutputName=".\private$\test_out11" />
<OutputDefinition OutputName=".\private$\test_out12" />
</OutputList>
</ProcessDefinition>
<ProcessDefinition
ProcessName="Worker2"
ProcessDesc="Assembly Worker with 1 Thread"
ProcessType="Assembly"
ProcessThreads="1"
InputQueue=".\private$\test_load2"
ErrorQueue=".\private$\test_error">
<OutputList>
<OutputDefinition OutputName="C:\MSDNMessageService\MessageExample.dll" />
<OutputDefinition OutputName="MSDNMessageService.MessageSample.ExampleClass"/>
</OutputList>
</ProcessDefinition>
</ProcessList>
</configuration>