【发布时间】:2014-11-19 22:59:48
【问题描述】:
我最近开始研究 RabbitMQ。我使用作为我的消费者的 RabbitMQ .net 库创建了一个 Windows 服务。此消费者将用于处理批量处理,例如发送大量电子邮件等。
我通过实现作为 RabbitMQ .net 库一部分的 SimpleRpcServer 类并覆盖 HandleCall/HandleCast 方法来构建它。在消费和处理消息方面,一切都很好。我们已开始研究可用于将此 Windows 服务部署到 Amazon Web Services 的服务器的部署选项。将更新部署到 Windows 服务时,必须停止、更新该服务,然后重新启动。
我的问题是:我该怎么做才能在 Windows 服务上触发 Stop 事件时,服务要么等待所有当前传递给消费者的消息完成处理并重新排队任何已发送但尚未开始处理的消息。
这里是一些示例代码:
public partial class ExampleService: ServiceBase
{
private List<Task> _watcherTasks = new List<Task>();
protected override void OnStart(string[] args)
{
var factory = new ConnectionFactory() {
HostName = _hostname,
VirtualHost = _virtualHost,
UserName = _username,
Password = _password,
Ssl = new SslOption
{
Enabled = true,
ServerName = _hostname,
AcceptablePolicyErrors = SslPolicyErrors.RemoteCertificateNameMismatch |
SslPolicyErrors.RemoteCertificateChainErrors
},
RequestedHeartbeat = 30
};
conn = factory.CreateConnection();
var emailQueue = requestChannel.QueueDeclare("email", false, false, false, null);
var emailSub = new Subscription(requestChannel, emailQueue);
var emailServer = new ServiceBusConsumer(emailSub);
Task emailWatcher = Task.Run(() => emailServer.MainLoop());
_watcherTasks.Add(emailWatcher);
}
protected override void OnStop()
{
conn.Close();
Task.WaitAll(_watcherTasks.ToArray(), 60000);
}
}
public class ServiceBusConsumer : SimpleRpcServer
{
public ServiceBusConsumer(Subscription subscription) : base(subscription)
{
}
public override void HandleSimpleCast(bool isRedelivered, RabbitMQ.Client.IBasicProperties requestProperties, byte[] body)
{
try
{
//Uses some reflection and invokes function to process the message here.
}
catch (Exception ex)
{
//Creates event log entry of exception
}
}
}
【问题讨论】:
标签: c# windows-services rabbitmq