共用方式為


SignalR 中的 HPC Pack 2016 作業和工作事件

您可以在 SingalR 用戶端中接收 HPC Pack 作業和工作事件。 不同的程式設計語言有各種用戶端。 我們在這裡採用 C# 以取得如何接收作業和工作事件的範例。

  1. 安裝 C# 用戶端 Microsoft.AspNet.SignalR.Client

  2. 在您的程式代碼中 usingMicrosoft.AspNet.SignalR.ClientMicrosoft.AspNet.SignalR.Client.Transports

  3. 然後,您會建立 HubConnection 實例,例如:

    var hubConnection = new HubConnection(url)
    

    這裡的 url 是“https://{your-cluster-name-or-ip}/hpc”。

    您可以選擇性地追蹤連線的錯誤

    var hubConnection = new HubConnection(url) { TraceLevel = TraceLevels.All, TraceWriter = Console.Error };
    

    您也可以新增錯誤處理程式,例如:

    hubConnection.Error += ex => Console.Error.WriteLine($"HubConnection Exception:\n{ex}");
    

    您必須提供存取事件的認證。 HTTP 基本身份驗證在這裡使用:

    hubConnection.Headers.Add("Authorization", BasicAuthHeader(username, password));
    
  4. 然後,您可以從中樞連線建立中樞 Proxy 物件,並從中接聽事件。

    針對 [作業事件],您可以建立 JobEventHub 並接聽 JobStateChange 事件:

    var jobEventHubProxy = hubConnection.CreateHubProxy("JobEventHub");
    jobEventHubProxy.On("JobStateChange", (int id, string state, string previousState) =>
    {
      Console.WriteLine($"Job: {id}, State: {state}, Previous State: {previousState}");
    });
    

    針對 [工作事件],您可以建立 TaskEventHub 並接聽 TaskStateChange 事件:

    var taskEventHubProxy = hubConnection.CreateHubProxy("TaskEventHub");
    taskEventHubProxy.On("TaskStateChange", (int id, int taskId, int instanceId, string state, string previousState) => 
    {
      Console.WriteLine($"Job: {id}, Task: {taskId}, Instance: {instanceId}, State: {state}, Previous State: {previousState}");
    });
    
  5. 然後,您可以透過下列方式連線到伺服器:

    await hubConnection.Start(new WebSocketTransport())
    

    我們在這裡明確指定 WebSocketTransport。 SignalR 支援各種傳輸方式。 但我們選擇 WebSocket。 如果您使用 WebSocket 以外的傳輸,您可能不會收到任何事件或完全無法連線。

  6. 最後,您會在中樞 Proxy 物件上呼叫 BeginListen 方法來開始接聽。 您必須指定您要接聽其作業/工作事件的作業識別碼。

    try
    {
      await jobEventHubProxy.Invoke("BeginListen", jobId);
      await taskEventHubProxy.Invoke("BeginListen", jobId);
    }
    catch (Exception ex)
    {
      Console.Error.WriteLine($"Exception on invoking server method:\n{ex}");
      return null;
    }
    

    叫用 BeginListen 方法時,catch 區塊會在伺服器上攔截錯誤。 針對中樞連線的其他錯誤,您可能需要使用錯誤處理程式,例如上一個步驟中的錯誤處理程式。

整個代碼段為:

using Microsoft.AspNet.SignalR.Client;
using Microsoft.AspNet.SignalR.Client.Transports;

//...

string BasicAuthHeader(string username, string password)
{
    string credentials = $"{username}:{password}";
    byte[] bytes = Encoding.ASCII.GetBytes(credentials);
    string base64 = Convert.ToBase64String(bytes);
    return $"Basic {base64}";
}

async Task<HubConnection> ListenToJobAndTasks(string url, int jobId, string username, string password)
{
    var hubConnection = new HubConnection(url) { TraceLevel = TraceLevels.All, TraceWriter = Console.Error };
    hubConnection.Headers.Add("Authorization", BasicAuthHeader(username, password));
    hubConnection.Error += ex => Console.Error.WriteLine($"HubConnection Exception:\n{ex}");

    var jobEventHubProxy = hubConnection.CreateHubProxy("JobEventHub");
    jobEventHubProxy.On("JobStateChange", (int id, string state, string previousState) =>
    {
        Console.WriteLine($"Job: {id}, State: {state}, Previous State: {previousState}");
    });

    var taskEventHubProxy = hubConnection.CreateHubProxy("TaskEventHub");
    taskEventHubProxy.On("TaskStateChange", (int id, int taskId, int instanceId, string state, string previousState) =>
    {
        Console.WriteLine($"Job: {id}, Task: {taskId}, Instance: {instanceId}, State: {state}, Previous State: {previousState}");
    });

    Console.WriteLine($"Connecting to {url} ...");
    try
    {
        await hubConnection.Start(new WebSocketTransport());
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine($"Exception on starting:\n{ex}");
        return null;
    }

    Console.WriteLine($"Begin to listen...");
    try
    {
        await jobEventHubProxy.Invoke("BeginListen", jobId);
        await taskEventHubProxy.Invoke("BeginListen", jobId);
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine($"Exception on invoking server method:\n{ex}");
        return null;
    }

    return hubConnection;
}