程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#消息隊列應用程序(2)

C#消息隊列應用程序(2)

編輯:關於C語言

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>

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