次の方法で共有


SignalR の HPC Pack 2016 ジョブおよびタスク イベント

HPC Pack ジョブおよびタスク イベントは、SingalR クライアントで受け取ることができます。 さまざまなプログラミング言語のさまざまなクライアントがあります。 ここでは、ジョブ イベントとタスク イベントを受信する方法の例を 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. 次に、ハブ接続からハブ プロキシ オブジェクトを作成し、そこからイベントをリッスンします。

    ジョブ イベントの場合は、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. 最後に、ハブ プロキシ オブジェクト 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;
}