Compartir a través de


Eventos de trabajo y tareas de HPC Pack 2016 en SignalR

Puede recibir eventos de trabajo y tareas de HPC Pack en un cliente de SingalR. Hay varios clientes para diferentes lenguajes de programación. Aquí se toma C# para ver un ejemplo de cómo recibir eventos de trabajo y tareas.

  1. Instale el cliente de C# Microsoft.AspNet.SignalR.Client.

  2. using Microsoft.AspNet.SignalR.Client y Microsoft.AspNet.SignalR.Client.Transports en el código.

  3. A continuación, cree una instancia de HubConnection como:

    var hubConnection = new HubConnection(url)
    

    Aquí el url es "https://{your-cluster-name-or-ip}/hpc".

    Opcionalmente, puede realizar un seguimiento de los errores de la conexión.

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

    Además, también puede agregar un controlador de errores como:

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

    Debe proporcionar credenciales para acceder a los eventos. La autenticación básica http se usa aquí:

    hubConnection.Headers.Add("Authorization", BasicAuthHeader(username, password));
    
  4. A continuación, cree objetos proxy de concentrador a partir de la conexión del concentrador y escuche eventos de ellos.

    En el caso de los eventos job, cree un JobEventHub y escuche el 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}");
    });
    

    En el caso de los eventos task, cree un TaskEventHub y escuche el 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. A continuación, conéctese al servidor mediante

    await hubConnection.Start(new WebSocketTransport())
    

    Aquí se especifica explícitamente el WebSocketTransport. SignalR admite varias formas de transporte. Pero elegimos WebSocket. Es posible que no obtenga ningún evento o no pueda conectarse en absoluto si usa transporte distinto de WebSocket.

  6. Por último, se llama al método BeginListen en el objeto proxy del centro para empezar a escuchar. Debe especificar el identificador de trabajo que desea escuchar a sus eventos de trabajo o tarea.

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

    El bloque catch detectará errores en el servidor al invocar el método BeginListen. Para otros errores en la conexión del concentrador, es posible que tenga que usar un controlador de errores como el del paso anterior.

El fragmento de código completo es:

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