如何載入工作處理程式

以下是關於工作處理器如何在啟動時載入工作處理程式 (Autodesk 的和協力廠商的) 的說明:

  1. 從 Extensions 資料夾載入所有協力廠商工作處理程式
  2. 讀取工作處理程式規劃資訊。
  3. 載入 Autodesk 的工作處理程式。
  4. 將工作類型與工作處理程式相關聯,並檢查是否每個工作處理程式都已啟用。

協力廠商工作處理程式延伸

每個協力廠商延伸都應位於其在如下 Extensions 目錄中的專有資料夾中:

%allusersprofile%\Autodesk\Vault 2012\Extensions\

因此,比如我們有一個名為「JobHandlerSample」的工作處理程式延伸,它應該位於 allusersprofile%\Autodesk\Vault 2014\Extensions\JobHandlerSample 目錄中。

對於 Extensions 目錄中的每個資料夾,工作處理器均會檢查其中有無規劃檔。規劃檔是可以隨意命名,但必須以 .vcet.config 做為副檔名的純文字檔案。如果規劃檔不存在,則將無法載入延伸。以下是範例規劃檔 JobHandlerSample.vcet.config 的內容:

<configuration>
    <connectivity.ExtensionSettings2>
         <assembly>JobHandlerSample</assembly>
         <extensionType>JobProcessor</extensionType>
    </connectivity.ExtensionSettings2>
</configuration>

assembly 元素指定延伸 dll 的名稱。因此,在以上範例中,延伸 dll 的名稱為 JobHandlerSample.dll。延伸類型 JobProcessor 表示這是一個工作處理器延伸 (此目錄中還可以存在其他延伸類型:WebService 和 VaultClient)。

現在延伸組合 (在我們的範例中為 JobHandlerSample.dll) 已載入。載入時完成了以下檢查:

  1. 檢查該組合 dll 的參考,以確保其未連結至任何 Vault dll (名稱以「Connectivity」開頭)。如果延伸組合連結至這些 dll 之一 (直接或間接),它將無法載入。
  2. 檢查組合是否包含實施 IJobHandler 介面的單個已匯出類型。在 JobHandlerSample 範例中,在組合的專案內,可以使用以下 C# 類來實施 IJobHandler 介面:
    namespace JobHandlerSample
    {
        public class JobHandlerSample : IJobHandler
         {
             public bool CanProcess(string strJobType)
              {
                 return strJobType.Equals("jobhandlersample");
              }
    
              public JobOutcome Execute(IJobProcessorServices context, IJob job)
               {
                  return JobOutcome.Success;
               }
          }
    }         

    在組合中必須恰好有一個 public 類型來實施 IJobHandler。否則,延伸將無法載入。會建立此類型的一個例證。

  3. 檢查該組合是否包含某些必需的組合屬性。特別是:
    1. ApiVersion:一個 Autodesk.Connectivity.Extensibility.Framework.ApiVersionAttribute 類型的屬性,其指定將使用此延伸的 Api 的版本。如果此版本與 Vault Api 的目前版本不符,則延伸將無法載入。
    2. Company、Description、ProductName:來自名稱空間 System.Reflection 的 AssemblyCompanyAttribute、AssemblyDescriptionAttribute、AssemblyProductAttribute 類型的屬性是必需的,且不能為空字串。如果這些屬性不存在或者為空,則延伸將無法載入。
    3. ExtensionId 一個 Autodesk.Connectivity.Extensibility.Framework.ExtensionIdAttribute 類型的屬性,其將唯一的 ID 指定為字串 (GUID 形式)。如果此屬性不存在或者為空,則延伸將無法載入。

工作處理程式規劃

工作處理程式規劃檔是一個 xml 檔案,其中包含了工作處理器的規劃資訊。該檔案與 JobProcessor.exe 位於同一目錄中 (通常為 C:\Program Files\Autodesk\Vault Professional [年份]\Explorer),並被命名為 JobProcessor.exe.config。工作處理程式規劃的相關區段在 configuration\connectivityExplorer\jobHandlers 下面。在此 xml 區段中,每個 jobHandler 元素都代表一個工作處理程式。jobHandler xml 元素的格式如下:

<jobHandler class="jobType" handler="NameOfTypeImplementingIJobHandler"/>

其中:

  1. class 代表工作類型。將工作加入到工作伺服器佇列時,會指定工作類型,而此唯一字串將用於確定將處理該工作的工作處理程式。
  2. handler 表示組合中實施 IJobHandler 的類型的名稱。這可以透過多種方式指定。您需要指定傳遞給 System.Type.GetType(string) (請參閱 http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx) 後將傳回組合中實施 IJobHandler 的物件類型的字串。

因此,對於我們的範例延伸,有效的 jobHandler 元素為:

<jobHandler class="jobhandlersample" handler="JobHandlerSample.JobHandlerSample, JobHandlerSample"/>

在 JobProcessor.exe.config 檔案中,您將注意到,對於每一個 Autodesk 內建工作處理程式,已經存在一個 jobHandler 項目。內建的工作處理程式僅在存在相應的 jobHandler 項目時才會載入。內建的工作處理程式 dll 與 JobProcessor.exe 位於同一個目錄中。

檢查工作處理程式是否已啟用

上述規劃資訊用於將工作類型與特定工作處理程式相關聯。完成後,系統會詢問每一個工作處理程式能否處理其特定的工作類型。工作處理程式透過實施介面方法 IJobHandler.CanProcess 來回答此問題。此時工作處理程式應檢查其是否具有處理對應類型的工作所需的一切 (例如,某些 dwf 建立工作處理程式會檢查是否安裝了 Inventor)。 

勾選工作處理器目前處理的工作類型時 (使用功能表「管理」->「工作類型...」),列示的每個項目都表示針對該工作類型成功載入了一個工作處理程式。如果勾選了項目,則表示啟用了相應的工作處理程式 (即,從其 IJobHandler.CanProcess 實施傳回了「true」)。若要讓工作處理器重新詢問工作處理程式「能否處理」,使用者將需要結束工作處理器並重新啟動它。

載入並詢問所有工作處理程式後,工作處理器即可開始提取佇列中的工作來進行處理。

範例工作處理程式

下面貼附的是用 C# 編寫的範例工作處理程式。它沒有任何實際的功能 (只會在呼叫 CanProcess 和 Execute 方法後彈出對話方塊),但可以做為樣板來建立工作處理程式。