首页 > 解决方案 > 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?

标签: c#rabbitmqeasynetq

解决方案


每次消息到达时,您都执行:

 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();

推荐阅读