我正在研究Rebus并将其与Azure Service Bus一起使用。使用它与regalure队列很容易,但是当我想使用Topic时,我无法让它工作。
这里有没有完成设置并使用主题/订阅。这是我到目前为止所做的。
static void Main(string[] args)
{
_bus1 = InitializeBus(System.Environment.MachineName);
_bus2 = InitializeBus(System.Environment.MachineName + "_2");
_bus3 = InitializeBus();
Run();
Console.WriteLine("Press Enter to exit!");
Console.ReadLine();
}
private static void Run()
{
try
{
_bus1.Handle<string>((b, c, m) => { Console.WriteLine(m); return null; });
_bus2.Handle<string>((b, c, m) => { Console.WriteLine(m); return null; });
_bus1.Bus.Subscribe<string>();
_bus2.Bus.Subscribe<string>();
_bus3.Bus.Publish("Publish test message");
}
catch (Exception ex)
{
throw;
}
}
private static BuiltinHandlerActivator InitializeBus(string queueName = null)
{
var activator = new BuiltinHandlerActivator();
if(string.IsNullOrEmpty(queueName))
Configure.With(activator)
.Transport(t => t.UseAzureServiceBusAsOneWayClient(connectionString))
.Options(o => { o.SetNumberOfWorkers(10); o.SetMaxParallelism(10); })
.Start();
else
Configure.With(activator)
.Transport(t => t.UseAzureServiceBus(connectionString, queueName).EnablePartitioning().DoNotCreateQueues())
.Options(o => { o.SetNumberOfWorkers(10); o.SetMaxParallelism(10); })
.Start();
return activator;
}
首先我创造了所有的公共汽车。我正在使用DontCreateQueues(),因为我不希望在我的根目录中创建重复的队列,但仅在主题下作为订阅。 然后我设置了总线并且发布工作正常,创建了一个Topic并在此主题下创建了2个订阅,并且每个订阅中都有1条消息。但这些消息从未收集过。
如果我在配置中删除DontCreateQueues()方法代码工作,但是在根目录中创建了2个队列,主题是2个订阅,但我不能这样。
最诚挚的问候 马格努斯
答案 0 :(得分:0)
Rebus通过为您订阅的每个主题创建订阅来使用主题,然后配置订阅以将收到的消息转发到总线的输入队列。
如果总线没有带有预期名称的输入队列(由Rebus创建的一个,或者您手动创建的一个),则无法正常工作。
DontCreateQueues()
存在的原因是允许专家用户配置他们的队列设置超出Rebus能够(并且愿意)做的事情。它需要非常详细的知识,了解Rebus如何预期你的队列实体,所以我建议几乎任何人都不要手动创建任何东西,然后简单地让Rebus设置。