EasyNetQ 中的 C# 许多 onMessage 操作
C# Many onMessage actions in EasyNetQ
我有一个问题。我有一个简单的方法可以创建对 RabbitMQ 总线的订阅并从中读取消息,然后触发适当的 onMessage 操作处理程序,它看起来像:
this.bus = RabbitHutch.CreateBus("host=localhost;timeout=999;virtualHost=/;username=guest;password=guest");
void timer1_Tick(object sender, EventArgs e)
{
Console.WriteLine($"{DateTime.Now}");
}
var subscribeId = "QueueId";
var running = false;
var handler = new Action<ResponseMessage>(response =>
{
switch (response.Op)
{
case "Start":
timer.AutoReset = true;
timer.Elapsed += timer1_Tick;
timer.Start();
break;
default: Console.WriteLine("Default");
break;
}
});
this.bus.Subscribe<ResponseMessage>(cabinetSubscribeId, handler, sub => sub.WithTopic(cabinetSubscribeId));
好吧,当这将收到一条消息时它工作正常,但如果另一条消息带有 Op 值开始(这可能会发生)我有 2 个处理程序 运行 彼此相邻,它们将递增每条传入的开始消息。
是否可以停止之前的 onMessage 处理程序,或者将其限制为 1 个?
每次消息到达你执行:
case "Start":
timer.AutoReset = true;
timer.Elapsed += timer1_Tick;
timer.Start();
break;
您创建了额外的计时器订阅。所以定时器现在会调用 time_click1 两次。
目前还不清楚为什么你在这里需要一个计时器,但如果你需要那么你需要先取消订阅以前的,也应该是线程圣人,所以在这段代码周围加上锁声明
case "Start":
timer.AutoReset = true;
timer.Elapsed -= timer1_Tick;
timer.Elapsed += timer1_Tick;
timer.Start();
我有一个问题。我有一个简单的方法可以创建对 RabbitMQ 总线的订阅并从中读取消息,然后触发适当的 onMessage 操作处理程序,它看起来像:
this.bus = RabbitHutch.CreateBus("host=localhost;timeout=999;virtualHost=/;username=guest;password=guest");
void timer1_Tick(object sender, EventArgs e)
{
Console.WriteLine($"{DateTime.Now}");
}
var subscribeId = "QueueId";
var running = false;
var handler = new Action<ResponseMessage>(response =>
{
switch (response.Op)
{
case "Start":
timer.AutoReset = true;
timer.Elapsed += timer1_Tick;
timer.Start();
break;
default: Console.WriteLine("Default");
break;
}
});
this.bus.Subscribe<ResponseMessage>(cabinetSubscribeId, handler, sub => sub.WithTopic(cabinetSubscribeId));
好吧,当这将收到一条消息时它工作正常,但如果另一条消息带有 Op 值开始(这可能会发生)我有 2 个处理程序 运行 彼此相邻,它们将递增每条传入的开始消息。
是否可以停止之前的 onMessage 处理程序,或者将其限制为 1 个?
每次消息到达你执行:
case "Start":
timer.AutoReset = true;
timer.Elapsed += timer1_Tick;
timer.Start();
break;
您创建了额外的计时器订阅。所以定时器现在会调用 time_click1 两次。 目前还不清楚为什么你在这里需要一个计时器,但如果你需要那么你需要先取消订阅以前的,也应该是线程圣人,所以在这段代码周围加上锁声明
case "Start":
timer.AutoReset = true;
timer.Elapsed -= timer1_Tick;
timer.Elapsed += timer1_Tick;
timer.Start();