我要求能够关闭/开启订阅者。这个想法是可以发送消息,但如果订阅者被关闭,他们就不会处理队列中的消息。重新打开后,他们开始处理队列中的消息。
我查看了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);
}
}
答案 0 :(得分:0)
我不明白你为什么这么说
只有一个订阅者,而不是所有订阅者,所以我不相信SetWorkerThreads(0)技术会起作用
因为这是我的建议:简单地将该活动工作线程的数量调低为该特定订户的零。
这样,它就会停止从队列中接收消息,然后通过将工作人员数量设置回大于零的某个数字来恢复消息处理。
顺便说一下。语法是这样的:
bus.Advanced.Workers.SetNumberOfWorkers(0);
它会阻止,直到调整了工人数量。