다음을 통해 공유


SignalR의 HPC Pack 2016 작업 및 작업 이벤트

SingalR 클라이언트에서 HPC 팩 작업 및 작업 이벤트를 받을 수 있습니다. 다양한 프로그래밍 언어에 대한 다양한 클라이언트가 있습니다. 여기서는 작업 및 작업 이벤트를 수신하는 방법의 예제를 보려면 C#을 사용합니다.

  1. C# 클라이언트 Microsoft.AspNet.SignalR.Client설치합니다.

  2. 코드에서 usingMicrosoft.AspNet.SignalR.ClientMicrosoft.AspNet.SignalR.Client.Transports.

  3. 그런 다음 다음과 같은 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));
    
  4. 그런 다음 허브 연결에서 허브 프록시 개체를 만들고 해당 개체의 이벤트를 수신 대기합니다.

    작업 이벤트의 경우 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}");
    });
    
  5. 그런 다음을 통해 서버에 연결합니다.

    await hubConnection.Start(new WebSocketTransport())
    

    여기서는 WebSocketTransport명시적으로 지정합니다. SignalR은 다양한 전송 방법을 지원합니다. 그러나 WebSocket을 선택합니다. WebSocket 이외의 전송을 사용하는 경우 이벤트를 받지 못하거나 연결에 실패할 수 있습니다.

  6. 마침내 허브 프록시 개체에서 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;
}