SignalR의 HPC Pack 2016 작업 및 작업 이벤트
SingalR 클라이언트에서 HPC 팩 작업 및 작업 이벤트를 받을 수 있습니다. 다양한 프로그래밍 언어에 대한 다양한 클라이언트가 있습니다. 여기서는 작업 및 작업 이벤트를 수신하는 방법의 예제를 보려면 C#을 사용합니다.
C# 클라이언트
Microsoft.AspNet.SignalR.Client
설치합니다.코드에서
using
Microsoft.AspNet.SignalR.Client
및Microsoft.AspNet.SignalR.Client.Transports
.그런 다음 다음과 같은
HubConnection
인스턴스를 만듭니다.var hubConnection = new HubConnection(url)
여기서
url
"https://{your-cluster-name-or-ip}/hpc"입니다.필요에 따라 연결 오류를 추적할 수 있습니다.
var hubConnection = new HubConnection(url) { TraceLevel = TraceLevels.All, TraceWriter = Console.Error };
다음과 같은 오류 처리기를 추가할 수도 있습니다.
hubConnection.Error += ex => Console.Error.WriteLine($"HubConnection Exception:\n{ex}");
이벤트에 액세스하기 위한 자격 증명을 제공해야 합니다. HTTP 기본 인증은 다음과 같이 사용됩니다.
hubConnection.Headers.Add("Authorization", BasicAuthHeader(username, password));
그런 다음 허브 연결에서 허브 프록시 개체를 만들고 해당 개체의 이벤트를 수신 대기합니다.
작업 이벤트의 경우
JobEventHub
만들고JobStateChange
이벤트를 수신 대기합니다.var jobEventHubProxy = hubConnection.CreateHubProxy("JobEventHub"); jobEventHubProxy.On("JobStateChange", (int id, string state, string previousState) => { Console.WriteLine($"Job: {id}, State: {state}, Previous State: {previousState}"); });
작업 이벤트의 경우
TaskEventHub
만들고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}"); });
그런 다음을 통해 서버에 연결합니다.
await hubConnection.Start(new WebSocketTransport())
여기서는
WebSocketTransport
명시적으로 지정합니다. SignalR은 다양한 전송 방법을 지원합니다. 그러나 WebSocket을 선택합니다. WebSocket 이외의 전송을 사용하는 경우 이벤트를 받지 못하거나 연결에 실패할 수 있습니다.마침내 허브 프록시 개체에서
BeginListen
메서드를 호출하여 수신 대기를 시작합니다. 해당 작업/작업 이벤트를 수신 대기할 작업 ID를 지정해야 합니다.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; }
catch
블록은BeginListen
메서드를 호출할 때 서버에서 오류를 catch합니다. 허브 연결에 대한 다른 오류의 경우 이전 단계의 오류 처리기와 같은 오류 처리기를 사용해야 할 수 있습니다.
전체 코드 조각은 다음과 같습니다.
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;
}