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

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

編輯:關於C語言

CworkerThread 導出類

任何從 CWorkerThread 中繼承的類都必須提供 OnStart、OnStop、OnPause、OnContinue 和 ProcessMessage 方法。OnStart 和 OnStop 方法獲取並釋放處理資源。OnPause 和 OnContinue 方法允許臨時釋放和重新獲取這些資源。ProcessMessage 方法應該處理消息,並在出現失敗事件時引發 CWorkerThreadException 異常。

由於 CWorkerThread 構造函數定義運行時參數,導出類必須調用基類構造函數:

public CWorkerThreadDerived(CWorker v_cParent, WorkerThreadFormatter v_wfThread)
: base (v_cParent, v_wfThread) {}

導出類提供了兩種類型的處理:將消息發送至另一隊列,或者調用組件方法。接收和發送消息的兩種實現使用了循環技術或應用程序偏移(保留在消息 APPSpecific 屬性中),作為使用哪一隊列的決定因素。此方案中的配置文件應該包括隊列路徑的列表。實現的 OnStart 和 OnStop 方法應該打開和關閉對這些隊列的引用:

iQueues = wfThread.OutputName.Length;
mqOutput = new MessageQueue[iQueues];
for (int idx=0; idx<iQueues; idx++)
{
 mqOutput[idx] = new MessageQueue(wfThread.OutputName[idx]);
 mqOutput[idx].Formatter = new ActiveXMessageFormatter();
}

在這些方案中,消息的處理很簡單:將消息發送必要的輸出隊列。在循環情況下,這個進程為:

try
{
 mqOutput[iNextQueue].Send(v_mInput);
}
catch (Exception ex)
{
 // 如果錯誤強制終止異常
 throw new CWorkerThreadException(ex.Message, true);
}
// 計算下一個隊列號
iNextQueue++;
iNextQueue %= iQueues;

後一種調用帶消息參數的組件的實現方法比較有趣。ProcessMessage 方法使用 IWebMessage 接口調入一個 .Net 組件。OnStart 和 OnStop 方法獲取和釋放此組件的引用。

此方案中的配置文件應該包含兩個項目:完整的類名和類所在文件的位置。按照 IWebMessage 接口中的定義,在組件上調用 Process 方法。

要獲取對象引用,需要使用 Activator.CreateInstance 方法。此函數需要一個程序集類型。在這裡,它是從程序集文件路徑和類名中導出的。一旦獲取對象引用,它將被放入合適的接口:

private IWebMessage iwmSample;
private string sFilePath, sTypeName;
// 保存程序集路徑和類型名稱
sFilePath = wfThread.OutputName[0];
sTypeName = wfThread.OutputName[1];
// 獲取對必要對象的引用
Assembly asmSample = Assembly.LoadFrom(sFilePath);
Type typSample = asmSample.GetType(sTypeName);
object obJSample = Activator.CreateInstance(typSample);
// 定義給對象的必要接口
iwmSample = (IWebMessage)obJSample;
獲取對象引用後,ProcessMessage 方法將在 IWebMessage 接口上調用 Process 方法:
WebMessageReturn wbrSample;
try
{
 // 定義方法調用的參數
 string sLabel = v_mInput.Label;
 string sBody = (string)v_mInput.Body;
 int iAppSpecific = v_mInput.APPSpecific;
 // 調用方法並捕捉返回代碼
 wbrSample = iwmSample.Process(sLabel, sBody, iAPPSpecific);
}
catch (InvalidCastException ex)
{
 // 如果在消息內容中發生錯誤,則強制發出一個非終止異常
 throw new CWorkerThreadException(ex.Message, false);
}
catch (Exception ex)
{
 // 如果錯誤調用程序集,則強制發出終止異常
 throw new CWorkerThreadException(ex.Message, true);
}
// 如果沒有錯誤,則檢查對象調用的返回狀態
switch (wbrSample)
{
 case WebMessageReturn.ReturnBad:
  throw new CWorkerThreadException
   ("Unable to process message: Message marked bad", false);
 case WebMessageReturn.ReturnAbort:
  throw new CWorkerThreadException
   ("Unable to process message: Process terminating", true);
 default:
  break;
}

提供的示例組件將消息正文寫入數據庫表。如果捕獲到嚴重數據庫錯誤,您可能希望終止處理過程,但是在這裡,僅僅將消息標記為錯誤的消息。

由於此示例中創建的類實例可能會獲取並保留昂貴的數據庫資源,所以用 OnPause 和 OnContinue 方法釋放和重新獲取對象引用。

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