SignalR 中的 HPC Pack 2016 作業和工作事件
您可以在 SingalR 用戶端中接收 HPC Pack 作業和工作事件。 不同的程式設計語言有各種用戶端。 我們在這裡採用 C# 以取得如何接收作業和工作事件的範例。
安裝 C# 用戶端
Microsoft.AspNet.SignalR.Client
。在您的程式代碼中
using
Microsoft.AspNet.SignalR.Client
和Microsoft.AspNet.SignalR.Client.Transports
。然後,您會建立
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));
然後,您可以從中樞連線建立中樞 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}"); });
然後,您可以透過下列方式連線到伺服器:
await hubConnection.Start(new WebSocketTransport())
我們在這裡明確指定
WebSocketTransport
。 SignalR 支援各種傳輸方式。 但我們選擇 WebSocket。 如果您使用 WebSocket 以外的傳輸,您可能不會收到任何事件或完全無法連線。最後,您會在中樞 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;
}