c# - C# EasyNetQ 中的许多 onMessage 操作
问题描述
我有个问题。我有一个简单的方法,它创建对 RabbitMQ 总线的订阅并从中读取消息,然后触发正确的 onMessage Action 处理程序,它看起来像:
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;
您创建对计时器的附加订阅。所以 timer 现在会调用 time_click1 两次。不清楚为什么在这里需要一个计时器,但是如果需要,则需要先取消订阅前一个,它也应该是线程圣人,所以在这段代码周围加上 lock 语句
case "Start":
timer.AutoReset = true;
timer.Elapsed -= timer1_Tick;
timer.Elapsed += timer1_Tick;
timer.Start();
推荐阅读
- java - 如何使用 Map 键作为列表对象和值作为顺序对 ArrayList 进行排序?
- php - 将 PHP 表单数据发送到不同的页面
- python - 'Nonetype' 不可调用
- flutter - 当我在有状态中使用时,颤振图像总是重新加载
- react-native - AsyncStorage 在 React-Native 中有奇怪的字符
- react-native - 如何获得 Base64 输出?
- symfony - 您一般如何解释有序地图?
- python - PySide2 - 设置/删除小部件之间的间距
- google-apps-script - 导出 Google 工作表并上传到 Sharepoint
- firebase - Firebase downloadUrl 和访问令牌冲突