가끔 작업할때 리퀘스트에 대한 응답을 보내고 난 다음에 후처리를 해야할때가 있다.
통계자료를 낸다던가 그럴때..
그런데 Request상에서 그짓거리하고 있으면 응답이 바로가지 않으니까.
정상서비스가 안된다.. 그래서 그걸위해서 MS가 BackgroundServices라는걸 만들었다.
이게 가만히보면 멀티플렛폼을 노렸다는걸 알수있는데 예전에는 이게 백쓰레드에서
큐방식으로 핸들링하고 있다가 서비스단으로 올라오면서 윈도우에서는 서비스목록에
나오는 그 서비스를 생성할수도 있고 리눅스에서는 백그라운드 데몬을 생성할수도 있게
되어 있는것 같다..
암튼 이걸만들기 위해서는 Startup.cs 에서 작업을 해야되는데..
알아보니까 이 Startup.cs가 웹서비스에서만 있는게 아닌것 같다. 닷넷생태계에서
통하는 하나의 솔루션같은게 되어버렸다. 우연히 ML.net 머신러닝을 볼일이 있었는데
거기에서도 파이프라인과 Startup 이 존재하게 프로그래밍이 가능하다. ㅇㅇ
[백그라운드 워커 클래스: 가볍게 로그만 찍는걸로다가]
//
public class AfterWorker : BackgroundService
{
//
private ConcurrentQueue<string> m_conqueue; //Thread Safe한 Queue
//
public AfterWorker()
{
m_conqueue = new ConcurrentQueue<string>();
Console.Log("백그라운드 테스크 생성됨.");
}
//
public void EnqueueMessage(string addMessage)
{
m_conqueue.Enqueue(addMessage);
}
//
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
//
while (!stoppingToken.IsCancellationRequested)
{
try
{
//작업처리
string deque_str;
if (m_conqueue.TryDequeue(out deque_str))
{
//메시지찍어보기
Console.Write(deque_str);
//
for (int i=0; i < 10; i++)
{
Console.Write("현재카운트: " + i);
await Task.Delay(TimeSpan.FromMilliseconds(500), stoppingToken);
}
}
//Sleep
await Task.Delay(TimeSpan.FromMilliseconds(100), stoppingToken);
} catch (Exception ex) {
Conosole.Write(ex.Message);
await Task.Delay(TimeSpan.FromMilliseconds(100), stoppingToken);
}
}
}
[ConfigureServices - AddHostedService에서 요로코롬 바인딩안해주면 인스턴스가 2개 생긴다.]
services.AddSingleton<AfterWorker>();
services.AddHostedService<AfterWorker>(provider => provider.GetService<AfterWorker>());
[컨트롤러에서 사용하기]
public calss MyController: Controller
{
//백그라운드 테스크
private AfterWorker _afterworker;
//생성자 에서 DI 받음
public HomeController(AfterWorker afterworker)
{
_afterworker = afterworker;
}
//메서드 사용
public IActionResult DoSome()
{
//어쩌고 저쩌고
//에프터워킹
_afterworker.EnqueMessage(str);
//응답
return Ok();
}
}
요로코롬 쓰면된다.. ㅇㅇ
응답은 응답대로 나가고 0.5초마다 로그도 찍는다.
좀더 유식하게 쓰고 싶으면 다음을 참조
https://docs.microsoft.com/ko-kr/dotnet/core/extensions/queue-service
아니면 행파이어쓰던가.. 시름마러!!
댓글 없음:
댓글 쓰기