Partager via


Événements de travail et de tâche HPC Pack 2016 dans SignalR

Vous pouvez recevoir des événements de tâche et de tâche HPC Pack dans un client SingalR . Il existe différents clients pour différents langages de programmation. Ici, nous prenons C# pour obtenir un exemple de réception des événements travail et tâche.

  1. Installez le client C# Microsoft.AspNet.SignalR.Client.

  2. using Microsoft.AspNet.SignalR.Client et Microsoft.AspNet.SignalR.Client.Transports dans votre code.

  3. Ensuite, vous créez une instance de HubConnection comme suit :

    var hubConnection = new HubConnection(url)
    

    Ici, le url est « https://{your-cluster-name-or-ip}/hpc ».

    Vous pouvez éventuellement suivre les erreurs de la connexion en

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

    Vous pouvez également ajouter un gestionnaire d’erreurs comme :

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

    Vous devez fournir des informations d’identification pour accéder aux événements. Http Basic Auth est utilisé ici :

    hubConnection.Headers.Add("Authorization", BasicAuthHeader(username, password));
    
  4. Ensuite, vous créez des objets proxy hub à partir de la connexion hub et écoutez les événements à partir d’eux.

    Pour les événements job, vous créez un JobEventHub et écoutez l’événement JobStateChange :

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

    Pour les événements Task, vous créez un TaskEventHub et écoutez l’événement 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. Ensuite, vous vous connectez au serveur par

    await hubConnection.Start(new WebSocketTransport())
    

    Ici, nous spécifions explicitement le WebSocketTransport. SignalR prend en charge différents modes de transport. Mais nous choisissons WebSocket. Vous ne pouvez pas obtenir d’événements ou ne pas se connecter du tout si vous utilisez le transport autre que WebSocket.

  6. Enfin, vous appelez BeginListen méthode sur l’objet proxy hub pour commencer à écouter. Vous devez spécifier l’ID de travail que vous souhaitez écouter à ses événements de travail/tâche.

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

    Le bloc catch intercepte les erreurs sur le serveur lors de l’appel de la méthode BeginListen. Pour d’autres erreurs sur la connexion hub, vous devrez peut-être utiliser un gestionnaire d’erreurs comme celui de l’étape précédente.

L’extrait de code entier est :

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