É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
Installez le client C#
Microsoft.AspNet.SignalR.Client
.using
Microsoft.AspNet.SignalR.Client
etMicrosoft.AspNet.SignalR.Client.Transports
dans votre code.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));
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énementJobStateChange
: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énementTaskStateChange
: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}"); });
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.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éthodeBeginListen
. 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;
}