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.
Instale el cliente de C#
Microsoft.AspNet.SignalR.Client
.using
Microsoft.AspNet.SignalR.Client
yMicrosoft.AspNet.SignalR.Client.Transports
en el código.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));
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 eventoJobStateChange
: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 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}"); });
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.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étodoBeginListen
. 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;
}