Я создаю службу Windows, и моя цель заключается в том, чтобы она прослушивала очередь RabbitMQ и записывала журнал в журнал событий Windows, когда в очереди появляется сообщение.Я пытаюсь выяснить, как заставить службу инициировать и сразу записать журнал, когда он видит сообщение в очереди RabbitMQ.Вот мой код для службы Windows:
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
namespace RabbitMQService
{
public partial class RabbitMQService : ServiceBase
{
private int eventId = 1;
public RabbitMQService()
{
InitializeComponent();
eventLog1 = new System.Diagnostics.EventLog();
if (!System.Diagnostics.EventLog.SourceExists("MySource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MySource", "MyNewLog");
}
eventLog1.Source = "MySource";
eventLog1.Log = "MyNewLog";
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 60000; // 60 seconds
timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer);
timer.Start();
}
public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
{
GetMessage();
eventLog1.WriteEntry("Monitoring the System", EventLogEntryType.Information, eventId++);
}
public void GetMessage()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
eventLog1.WriteEntry("Message Received: " + message);
};
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);
eventLog1.WriteEntry("Starting to listen for messages from the queue");
}
}
protected override void OnStop()
{
eventLog1.WriteEntry("In OnStop.");
}
protected override void OnContinue()
{
eventLog1.WriteEntry("In OnContinue.");
}
}
}
В настоящее время он будет записывать сообщение в журнал только тогда, когда метод таймера срабатывает каждые 60 секунд.Когда я строил этот эксперимент как консольное приложение, оно сразу отображало сообщение, как только оно попадало в очередь, когда клиент отправлял сообщение.Просто FYI, вот клиентское консольное приложение, которое отправляет сообщение:
using System;
using System.Text;
using RabbitMQ.Client;
namespace Send
{
class Send
{
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "xxx.xxx.xxx.xxx", UserName = "xxx", Password = "xxx" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0}", message);
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}
}
Приемное консольное приложение, которое я упоминал выше, в точности похоже на код в методе GetMessage () службы Windows, которую я создал.