Add Queue to Dependency Injection (Optimize)

This commit is contained in:
Suphonchai Phoonsawat 2024-08-19 21:20:05 +07:00
parent c0749bdc20
commit cf7a79166a
3 changed files with 116 additions and 33 deletions

View file

@ -14,6 +14,7 @@ using BMA.EHR.Leave.Service.DTOs.ChangeRound;
using BMA.EHR.Leave.Service.DTOs.CheckIn; using BMA.EHR.Leave.Service.DTOs.CheckIn;
using BMA.EHR.Leave.Service.DTOs.DutyTime; using BMA.EHR.Leave.Service.DTOs.DutyTime;
using BMA.EHR.Leave.Service.DTOs.LeaveRequest; using BMA.EHR.Leave.Service.DTOs.LeaveRequest;
using BMA.EHR.Leave.Service.Services;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -58,6 +59,10 @@ namespace BMA.EHR.Leave.Service.Controllers
private readonly string _bucketName = "check-in"; private readonly string _bucketName = "check-in";
private readonly string _fakeQueueName = "fake-checkin-queue";
private readonly string _realQueueName = "checkin-queue";
private readonly RabbitCheckInService _rabbitCheckInService;
#endregion #endregion
#region " Constuctor and Destructor " #region " Constuctor and Destructor "
@ -75,7 +80,8 @@ namespace BMA.EHR.Leave.Service.Controllers
AdditionalCheckRequestRepository additionalCheckRequestRepository, AdditionalCheckRequestRepository additionalCheckRequestRepository,
UserCalendarRepository userCalendarRepository, UserCalendarRepository userCalendarRepository,
CommandRepository commandRepository, CommandRepository commandRepository,
LeaveRequestRepository leaveRequestRepository) LeaveRequestRepository leaveRequestRepository,
RabbitCheckInService rabbitCheckInService)
{ {
_dutyTimeRepository = dutyTimeRepository; _dutyTimeRepository = dutyTimeRepository;
_context = context; _context = context;
@ -91,6 +97,7 @@ namespace BMA.EHR.Leave.Service.Controllers
_userCalendarRepository = userCalendarRepository; _userCalendarRepository = userCalendarRepository;
_commandRepository = commandRepository; _commandRepository = commandRepository;
_leaveRequestRepository = leaveRequestRepository; _leaveRequestRepository = leaveRequestRepository;
_rabbitCheckInService = rabbitCheckInService;
} }
@ -458,27 +465,32 @@ namespace BMA.EHR.Leave.Service.Controllers
Token = AccessToken ?? "" Token = AccessToken ?? ""
}; };
// create connection //// create connection
var factory = new ConnectionFactory() //var factory = new ConnectionFactory()
{ //{
HostName = _configuration["Rabbit:Host"], // HostName = _configuration["Rabbit:Host"],
UserName = _configuration["Rabbit:User"], // UserName = _configuration["Rabbit:User"],
Password = _configuration["Rabbit:Password"], // Password = _configuration["Rabbit:Password"],
}; //};
// create channel //// create channel
using var connection = factory.CreateConnection(); //using var connection = factory.CreateConnection();
using var channel = connection.CreateModel(); //using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "checkin-queue", durable: false, exclusive: false, autoDelete: false, arguments: null); //channel.QueueDeclare(queue: "checkin-queue", durable: false, exclusive: false, autoDelete: false, arguments: null);
//// แปลง Object เป็น JSON สตริง
//var serializedObject = JsonConvert.SerializeObject(checkData);
//// แปลง JSON สตริงเป็น byte array
//var body = Encoding.UTF8.GetBytes(serializedObject);
//channel.BasicPublish(exchange: "", routingKey: "checkin-queue", basicProperties: null, body: body);
//Console.WriteLine($"Send to Queue: {serializedObject}");
// แปลง Object เป็น JSON สตริง
var serializedObject = JsonConvert.SerializeObject(checkData); var serializedObject = JsonConvert.SerializeObject(checkData);
// แปลง JSON สตริงเป็น byte array
var body = Encoding.UTF8.GetBytes(serializedObject); var body = Encoding.UTF8.GetBytes(serializedObject);
_rabbitCheckInService.SendMessageToQueue(_realQueueName, body);
channel.BasicPublish(exchange: "", routingKey: "checkin-queue", basicProperties: null, body: body);
Console.WriteLine($"Send to Queue: {serializedObject}");
return Success(new { date = currentDate }); return Success(new { date = currentDate });
} }
@ -500,27 +512,25 @@ namespace BMA.EHR.Leave.Service.Controllers
{ {
var currentDate = DateTime.Now; var currentDate = DateTime.Now;
// create connection //// create connection
var factory = new ConnectionFactory() //var factory = new ConnectionFactory()
{ //{
HostName = _configuration["Rabbit:Host"], // HostName = _configuration["Rabbit:Host"],
UserName = _configuration["Rabbit:User"], // UserName = _configuration["Rabbit:User"],
Password = _configuration["Rabbit:Password"], // Password = _configuration["Rabbit:Password"],
}; //};
// create channel //// create channel
using var connection = factory.CreateConnection(); //using var connection = factory.CreateConnection();
using var channel = connection.CreateModel(); //using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "fake-checkin-queue", durable: false, exclusive: false, autoDelete: false, arguments: null); //channel.QueueDeclare(queue: "fake-checkin-queue", durable: false, exclusive: false, autoDelete: false, arguments: null);
// แปลง Object เป็น JSON สตริง
var serializedObject = JsonConvert.SerializeObject(data); var serializedObject = JsonConvert.SerializeObject(data);
// แปลง JSON สตริงเป็น byte array
var body = Encoding.UTF8.GetBytes(serializedObject); var body = Encoding.UTF8.GetBytes(serializedObject);
_rabbitCheckInService.SendMessageToQueue(_fakeQueueName, body);
channel.BasicPublish(exchange: "", routingKey: "fake-checkin-queue", basicProperties: null, body: body); //channel.BasicPublish(exchange: "", routingKey: "fake-checkin-queue", basicProperties: null, body: body);
Console.WriteLine($"Send to Queue: {serializedObject}"); //Console.WriteLine($"Send to Queue: {serializedObject}");
return Success(new { date = currentDate }); return Success(new { date = currentDate });
} }

View file

@ -21,6 +21,8 @@ using System.Transactions;
using BMA.EHR.Leave.Service.Filters; using BMA.EHR.Leave.Service.Filters;
using Hangfire.Common; using Hangfire.Common;
using BMA.EHR.Application.Repositories.Leaves.TimeAttendants; using BMA.EHR.Application.Repositories.Leaves.TimeAttendants;
using RabbitMQ.Client;
using BMA.EHR.Leave.Service.Services;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
{ {
@ -28,6 +30,51 @@ var builder = WebApplication.CreateBuilder(args);
var key = builder.Configuration["Jwt:Key"]; var key = builder.Configuration["Jwt:Key"];
// ตั้งค่า RabbitMQ connection
builder.Services.AddSingleton<IConnection>(sp =>
{
var factory = new ConnectionFactory()
{
HostName = builder.Configuration["Rabbit:Host"],
UserName = builder.Configuration["Rabbit:User"],
Password = builder.Configuration["Rabbit:Password"],
};
return factory.CreateConnection();
});
builder.Services.AddSingleton<IModel>(sp =>
{
var connection = sp.GetRequiredService<IConnection>();
var channel = connection.CreateModel();
// ประกาศ queue
channel.QueueDeclare(queue: "fake-checkin-queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
return channel;
});
builder.Services.AddSingleton<IModel>(sp =>
{
var connection = sp.GetRequiredService<IConnection>();
var channel = connection.CreateModel();
// ประกาศ queue
channel.QueueDeclare(queue: "checkin-queue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
return channel;
});
IdentityModelEventSource.ShowPII = true; IdentityModelEventSource.ShowPII = true;
builder.Services.AddHttpContextAccessor(); builder.Services.AddHttpContextAccessor();
@ -89,6 +136,8 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.AddPersistence(builder.Configuration); builder.Services.AddPersistence(builder.Configuration);
builder.Services.AddLeavePersistence(builder.Configuration); builder.Services.AddLeavePersistence(builder.Configuration);
builder.Services.AddSingleton<RabbitCheckInService>();
builder.Services.AddControllers(options => builder.Services.AddControllers(options =>
{ {
options.SuppressAsyncSuffixInActionNames = false; options.SuppressAsyncSuffixInActionNames = false;

View file

@ -0,0 +1,24 @@
using RabbitMQ.Client;
using System.Text;
namespace BMA.EHR.Leave.Service.Services
{
public class RabbitCheckInService
{
private readonly IModel _channel;
public RabbitCheckInService(IModel channel)
{
_channel = channel;
}
public void SendMessageToQueue(string queueName, byte[] body)
{
//var body = Encoding.UTF8.GetBytes(message);
_channel.BasicPublish(exchange: "",
routingKey: queueName,
basicProperties: null,
body: body);
}
}
}