JustJordanT / pizza-planet

Pizza Planet Application 🍕 🛻 - A place for me to build a modular Monolith
2 stars 0 forks source link

Worker service for pulling queue #25

Closed JustJordanT closed 1 year ago

JustJordanT commented 1 year ago

one way to implement a background job to pick up messages from a queue is to use a BackgroundWorker class. Here's an example of how this could be implemented:

using System;
using System.ComponentModel;
using System.Messaging;

class Program
{
    static void Main()
    {
        // Create a new BackgroundWorker object
        var worker = new BackgroundWorker();

        // Set the worker to run in the background
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;

        // Add event handlers for the DoWork and ProgressChanged events
        worker.DoWork += worker_DoWork;
        worker.ProgressChanged += worker_ProgressChanged;

        // Start the worker
        worker.RunWorkerAsync();

        // Wait for the worker to finish
        while (worker.IsBusy)
        {
            // Allow the worker to process messages
            System.Threading.Thread.Sleep(100);
        }

        Console.WriteLine("Worker completed.");
        Console.ReadLine();
    }

    static void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Get the BackgroundWorker object that raised this event
        var worker = sender as BackgroundWorker;

        // Connect to the message queue
        var queue = new MessageQueue(".\\myQueue");
        queue.Formatter = new XmlMessageFormatter(new[] { typeof(string) });

        // Continuously poll the queue for new messages
        while (!worker.CancellationPending)
        {
            // Try to receive a message from the queue
            Message message = null;
            try
            {
                message = queue.Receive(new TimeSpan(0, 0, 1));
            }
            catch (MessageQueueException)
            {
                // Handle any exceptions that occur while trying to receive a message
            }

            if (message != null)
            {
                // Process the message
                string msg = message.Body as string;
                Console.WriteLine("Received message: " + msg);
                worker.ReportProgress(0);
            }
        }
    }

    static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // Update the UI with the progress of the worker
        Console.WriteLine("Worker is processing messages...");
    }
}

This example creates a new BackgroundWorker object and sets it to run in the background. The DoWork event handler is used to poll the message queue and process any new messages that are received. The ProgressChanged event handler is used to update the UI with the progress of the worker.

You need to install MessageQueue package System.Messaging and add it to the reference of the project, Also, you need to replace .\myQueue with the actual path of your queue.

This is a basic example, and it can be modified depending on your needs.

JustJordanT commented 1 year ago

Don't think this will be needed, based on the docs this should be a automatic thing once consumer has been configured.