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
Instale o cliente C#
Microsoft.AspNet.SignalR.Client
.using
Microsoft.AspNet.SignalR.Client
eMicrosoft.AspNet.SignalR.Client.Transports
em seu código.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));
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 eventoJobStateChange
: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 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}"); });
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.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étodoBeginListen
. 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;
}