暂停订阅者

时间:2017-11-03 13:23:02

标签: .net rebus

我要求能够关闭/开启订阅者。这个想法是可以发送消息,但如果订阅者被关闭,他们就不会处理队列中的消息。重新打开后,他们开始处理队列中的消息。

我查看了pub / sub和request / reply示例,并提取了Rebus的源代码以查找可以回答此问题的任何功能。存在一种延迟方法,其中可以将时间延迟应用于发送消息,但是我需要的延迟是基于打开和关闭订户。

主要问题是,是否有某种方式暂停订阅者?

(只有一个订阅者,而不是所有订阅者,所以我不相信SetWorkerThreads(0)技术会起作用)

更新答案是使用_activator.Bus.Advanced.Workers.SetNumberOfWorkers(0),如下所示:

public static class Subscriber1
{
    private static BuiltinHandlerActivator _activator;
    public static void Start(ILogger logger)
    {
        _activator = new BuiltinHandlerActivator();
        _activator.Register(() => new Subscriber1MessageHandler());
        Configure.With(_activator)
                 .Transport(t => t.UseMsmq("subscriber1"))
                 .Logging(l => l.Serilog(logger))
                 .Routing(r => r.TypeBased().Map<Subscriber1Message>("thepublisher"))
                 .Start();
        _activator.Bus.Subscribe<Subscriber1Message>().Wait();
    }
    public static void Pause()
    {
        _activator.Bus.Advanced.Workers.SetNumberOfWorkers(0);
    }
    public static void Resume()
    {
        _activator.Bus.Advanced.Workers.SetNumberOfWorkers(1);
    }
}

1 个答案:

答案 0 :(得分:0)

我不明白你为什么这么说

  

只有一个订阅者,而不是所有订阅者,所以我不相信SetWorkerThreads(0)技术会起作用

因为这是我的建议:简单地将该活动工作线程的数量调低为该特定订户的零。

这样,它就会停止从队列中接收消息,然后通过将工作人员数量设置回大于零的某个数字来恢复消息处理。

顺便说一下。语法是这样的:

bus.Advanced.Workers.SetNumberOfWorkers(0);

它会阻止,直到调整了工人数量。