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 方法釋放和重新獲取對象引用。