HPC Pack ジョブおよびタスク イベントは、SingalR クライアントで受け取ることができます。 さまざまなプログラミング言語のさまざまなクライアントがあります。 ここでは、ジョブ イベントとタスク イベントを受信する方法の例を 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));
次に、ハブ接続からハブ プロキシ オブジェクトを作成し、そこからイベントをリッスンします。
ジョブ イベントの場合は、
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 以外のトランスポートを使用する場合、イベントを取得したり、接続に失敗したりすることはできません。最後に、ハブ プロキシ オブジェクト
BeginListen
メソッドを呼び出してリッスンを開始します。 ジョブ/タスク イベントをリッスンするジョブ ID を指定する必要があります。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; }
catch
ブロックは、BeginListen
メソッドを呼び出すときにサーバー上のエラーをキャッチします。 ハブ接続に関するその他のエラーについては、前の手順のようなエラー ハンドラーを使用することが必要な場合があります。
コード スニペット全体は次のとおりです。
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;
}