我正在创建一个以无限循环运行的消费者来读取队列中的消息.我正在寻找关于如何在我的无限循环中继续恢复abd的建议/示例代码,即使存在网络中断.消费者必须保持运行,因为它将作为WindowsService安装.
1)有人可以解释如何正确使用这些设置吗?他们之间有什么区别?
NetworkRecoveryInterval
AutomaticRecoveryEnabled
RequestedHeartbeat
Run Code Online (Sandbox Code Playgroud)
2)请查看我当前的消费者示例代码.我使用的是.Net RabbitMQ Client v3.5.6.
以上设置如何为我"恢复"?例如,consumer.Queue.Dequeue阻止,直到它被恢复?这似乎不对......
我是否需要手动编写代码?例如,consumer.Queue.Dequeue抛出一个异常,我必须检测并手动重新创建我的连接,通道和消费者?或者只是消费者,因为"AutomaticRecovery"会为我恢复频道?
这是否意味着我应该在while循环中移动消费者创造?那么频道创作呢?和连接创建?
3)假设我必须手动执行一些恢复代码,是否有事件回调(以及如何注册它们)告诉我有网络问题?
谢谢!
public void StartConsumer(string queue)
{
using (IModel channel = this.Connection.CreateModel())
{
var consumer = new QueueingBasicConsumer(channel);
const bool noAck = false;
channel.BasicConsume(queue, noAck, consumer);
// do I need these conditions? or should I just do while(true)???
while (channel.IsOpen &&
Connection.IsOpen &&
consumer.IsRunning)
{
try
{
BasicDeliverEventArgs item;
if (consumer.Queue.Dequeue(Timeout, out item))
{
string message = System.Text.Encoding.UTF8.GetString(item.Body);
DoSomethingMethod(message);
channel.BasicAck(item.DeliveryTag, false);
}
}
catch (EndOfStreamException ex)
{
// …Run Code Online (Sandbox Code Playgroud)