Condividi tramite


Eventi di processi e attività HPC Pack 2016 in SignalR

È possibile ricevere eventi HPC Pack Job and Task in un client SingalR . Esistono diversi client per linguaggi di programmazione diversi. Di seguito viene illustrato C# per un esempio di come ricevere eventi Job e Task.

  1. Installare il client C# Microsoft.AspNet.SignalR.Client.

  2. using Microsoft.AspNet.SignalR.Client e Microsoft.AspNet.SignalR.Client.Transports nel codice.

  3. Si crea quindi un'istanza di HubConnection simile alla seguente:

    var hubConnection = new HubConnection(url)
    

    Qui il url è "https://{nome-cluster-or-ip}/hpc".

    Facoltativamente, è possibile tracciare gli errori della connessione tramite

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

    È anche possibile aggiungere un gestore errori come:

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

    È necessario fornire credenziali per l'accesso agli eventi. L'autenticazione di base HTTP viene usata qui:

    hubConnection.Headers.Add("Authorization", BasicAuthHeader(username, password));
    
  4. Creare quindi oggetti proxy hub dalla connessione hub e ascoltare gli eventi da essi.

    Per gli eventi job, creare un JobEventHub e ascoltare l'evento JobStateChange:

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

    Per gli eventi Task, creare un TaskEventHub e ascoltare l'evento 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. Connettersi quindi al server tramite

    await hubConnection.Start(new WebSocketTransport())
    

    In questo caso si specifica in modo esplicito il WebSocketTransport. SignalR supporta vari modi di trasporto. Ma scegliamo WebSocket. Se si utilizza il trasporto diverso da WebSocket, è possibile che non vengano visualizzati eventi o non si riesca a connettersi.

  6. Infine, si chiama BeginListen metodo sull'oggetto proxy hub per avviare l'ascolto. È necessario specificare l'ID processo che si desidera ascoltare i relativi eventi di processo/attività.

    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;
    }
    

    Il blocco catch intercetta gli errori nel server quando si richiama il metodo BeginListen. Per altri errori nella connessione all'hub, potrebbe essere necessario usare un gestore errori come quello del passaggio precedente.

L'intero frammento di codice è:

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;
}