Merge pull request #139 from soumt-r/grpc_fix

heartbeat grpc service
This commit is contained in:
Namhyeon Go 2024-09-06 15:35:14 +09:00 committed by GitHub
commit da08bb7bb9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -9,6 +9,7 @@ using System.ServiceProcess;
using Grpc.Net.Client; using Grpc.Net.Client;
using Grpc.Net.Client.Web; using Grpc.Net.Client.Web;
using System.Net.Http; using System.Net.Http;
using System.Threading;
namespace WelsonJS.Service namespace WelsonJS.Service
{ {
@ -54,47 +55,77 @@ namespace WelsonJS.Service
public async Task StartHeartbeatAsync() public async Task StartHeartbeatAsync()
{ {
var call = _client.CheckHeartbeat(); while (true)
try
{ {
while (true) var call = _client.CheckHeartbeat();
try
{ {
var request = new HeartbeatRequest {
var request = new HeartbeatRequest
{
IsAlive = true IsAlive = true
}; };
await call.RequestStream.WriteAsync(request); await call.RequestStream.WriteAsync(request);
await call.RequestStream.CompleteAsync();
_parent.Log("Sent heartbeat"); _parent.Log("Sent heartbeat");
if (await call.ResponseStream.MoveNext()) await Task.Delay(HeartbeatInterval); // HeartbeatInterval 동안 대기
}
catch (Exception ex)
{
_parent.Log("Heartbeat request stream failed: " + ex.Message);
}
// 서버 응답을 수신하는 작업
try
{
while (await call.ResponseStream.MoveNext())
{ {
var response = call.ResponseStream.Current; var response = call.ResponseStream.Current;
_parent.Log("Heartbeat response received: " + response.IsAlive); _parent.Log("Heartbeat response received: " + response.IsAlive);
} }
await Task.Delay(HeartbeatInterval);
} }
} catch (RpcException ex)
finally {
{ _parent.Log($"gRPC error: {ex.Status.Detail}");
await call.RequestStream.CompleteAsync(); }
catch (Exception ex)
{
_parent.Log($"Unexpected error: {ex.Message}");
}
finally
{
// 잠시 대기 후 재연결
await Task.Delay(TimeSpan.FromMilliseconds(HeartbeatInterval));
}
} }
} }
public async Task StartEventListenerAsync() public async Task StartEventListenerAsync()
{ {
var eventRequest = new FetchEventsRequest { var eventRequest = new FetchEventsRequest
{
ClientId = clientId ClientId = clientId
}; };
var eventCall = _client.FetchPendingEvents(eventRequest); while (true)
try
{ {
while (await eventCall.ResponseStream.MoveNext()) var eventCall = _client.FetchPendingEvents(eventRequest);
try
{ {
var response = eventCall.ResponseStream.Current; while (await eventCall.ResponseStream.MoveNext())
_parent.Log($"Received event from server: {response.EventType} with args: {string.Join(", ", response.Args)}"); {
var response = eventCall.ResponseStream.Current;
_parent.Log($"Received event from server: {response.EventType} with args: {string.Join(", ", response.Args)}");
}
}
finally
{
await Task.Delay(TimeSpan.FromMilliseconds(HeartbeatInterval));
} }
} }
finally {}
} }
public async Task ShutdownAsync() public async Task ShutdownAsync()