Compartilhar via


Eventos de trabalho e tarefa do HPC Pack 2016 no SignalR

Você pode receber eventos de Trabalho e Tarefa do HPC Pack em um cliente do SingalR . Há vários clientes para diferentes linguagens de programação. Aqui, usamos C# para obter um exemplo de como receber eventos de Trabalho e Tarefa.

  1. Instale o cliente C# Microsoft.AspNet.SignalR.Client.

  2. using Microsoft.AspNet.SignalR.Client e Microsoft.AspNet.SignalR.Client.Transports em seu código.

  3. Em seguida, você cria uma instância de HubConnection como:

    var hubConnection = new HubConnection(url)
    

    Aqui, o url é "https://{your-cluster-name-or-ip}/hpc".

    Opcionalmente, você pode rastrear erros da conexão

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

    E você também pode adicionar um manipulador de erros como:

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

    Você deve fornecer credencial para acessar os eventos. A autenticação básica HTTP é usada aqui:

    hubConnection.Headers.Add("Authorization", BasicAuthHeader(username, password));
    
  4. Em seguida, você cria objetos proxy de hub a partir da conexão do hub e escuta eventos deles.

    Para eventos de trabalho, você cria um JobEventHub e escuta o 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}");
    });
    

    Para eventos de tarefa, você cria um TaskEventHub e escuta o 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. Em seguida, você se conecta ao servidor por

    await hubConnection.Start(new WebSocketTransport())
    

    Aqui, especificamos explicitamente o WebSocketTransport. O SignalR dá suporte a várias maneiras de transporte. Mas escolhemos WebSocket. Você pode não obter eventos ou não se conectar se usar transporte diferente de WebSocket.

  6. Por fim, você chama BeginListen método no objeto proxy do hub para começar a ouvir. Você deve especificar a ID do trabalho que deseja ouvir seus eventos de trabalho/tarefa.

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

    O bloco catch detectará erros no servidor ao invocar o método BeginListen. Para outros erros na conexão do hub, talvez seja necessário usar um manipulador de erros como o da etapa anterior.

O snippet de código inteiro é:

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