Introduction
We have a few issues in our IPC process that some of our IPC calls are dropped out. I am looking for a more robust way to handle the calls. One thing I am looking at is the Microsoft Message Queue.
Installing
Setup
By using the Management Console, I have created a new private queue called Test.
We will give IIS_IUSRS permissions to access the queue.
We will give IIS_IUSRS permissions to access the queue.
nopCommerce
I have skipped some of the steps on about extending the class. They were previously discussed in nopCommerce - Custom Service inherit from Core Service by Dependency Injection and new interface.
To use MessageQueue when sending out emails, we will need to extend the WorkflowMessageService class to consume our MessageQueueService. We need create a property for IoC, change our ctor, and override the SendNotification Method.
Inside our ctor
In our override SendNotification(), we will call our queue service instead
MessageQueueService
We will create a very simple class to handle MessageQueue operations. I would recommend something more robust and reliable for real life application.using System.Messaging; public interface IMessageQueueService { void SendQueue(QueuedEmail queuedEmail); } public class MessageQueueService : IMessageQueueService { public override void SendQueue(QueuedEmail queuedEmail) { if (queuedEmail == null) throw new ArgumentNullException("queuedEmail"); using (MessageQueue messageQueue = new MessageQueue(@".\private$\Test")) { using (var transaction = new MessageQueueTransaction()) { transaction.Begin(); messageQueue.Send(queuedEmail, queuedEmail.Subject, transaction); transaction.Commit(); } } } }
DependencyRegistrar.cs
builder.RegisterType<MessageQueueService>().As<IMessageQueueService>();
WorkflowMessageService.cs
To use MessageQueue when sending out emails, we will need to extend the WorkflowMessageService class to consume our MessageQueueService. We need create a property for IoC, change our ctor, and override the SendNotification Method.
// Properties protected readonly IMessageQueueService _messageQueueService;
Inside our ctor
_messageQueueService = messageQueueService;
In our override SendNotification(), we will call our queue service instead
// _queuedEmailService.InsertQueuedEmail(email); _messageQueueService.SendQueue(email);
Queue
Do something on the site that will trigger an email. If everything is setup correctly, you should see a message added to the queue.
Conclusion
Although we have only done it for emails, but we can easily use it for any IPC calls. The sky is the limit.
By using a mean of MSMQ as a middle layer, we decouple our system from 3rd party integration points. Thus, conform with the ultimate rule of loose couple and high cohesion in OO design.
This concludes the most basic setup for using MSMQ in nopCommerce. The next part is for our 3rd party system to read from the queue - which is their problem :)
By using a mean of MSMQ as a middle layer, we decouple our system from 3rd party integration points. Thus, conform with the ultimate rule of loose couple and high cohesion in OO design.
This concludes the most basic setup for using MSMQ in nopCommerce. The next part is for our 3rd party system to read from the queue - which is their problem :)
No comments:
Post a Comment