Eventi di processi e attività HPC Pack 2016 in SignalR
È possibile ricevere eventi HPC Pack Job and Task in un client SingalR
Installare il client C#
Microsoft.AspNet.SignalR.Client
.using
Microsoft.AspNet.SignalR.Client
eMicrosoft.AspNet.SignalR.Client.Transports
nel codice.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));
Creare quindi oggetti proxy hub dalla connessione hub e ascoltare gli eventi da essi.
Per gli eventi job, creare un
JobEventHub
e ascoltare l'eventoJobStateChange
: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'eventoTaskStateChange
: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}"); });
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.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 metodoBeginListen
. 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;
}