调整以下应用程序以与Azure Service Bus一起使用。 https://github.com/rebus-org/RebusSamples/tree/master/PubSub
但是,下面创建了。
队列
错误
发布者
订户
主题
messages_datetimemessage__messages:订户
messages_stringmessage__messages:订户
messages_timespanmessage__messages:订户
我的问题
这是正确的吗?
是否可以减少所创建工件的数量?例如,请减少为一个主题,因为该主题用于pub sub。
更新
如果可能,我需要将Pub子模式与一个Topic和一个或两个订阅一起使用。
但是,下面有一个错误:
System.AggregateException HResult = 0x80131500 Message =一个或多个 发生错误。 (无法发布到主题“订单”)
来源= System.Private.CoreLib StackTrace:at System.Threading.Tasks.Task.Wait(Int32毫秒超时, 的CancellationToken cancelToken() System.Threading.Tasks.Task.Wait()位于Publisher.Program.Main()中 C:_MyLab \ ReBus \ PubSub \ Publisher \ Program.cs:第43行内部异常1:RebusApplicationException:无法发布到 主题“订单”
内部异常2:InvalidOperationException:无法打开主题 实体类型队列的客户端。 TrackingId:5c380af2-ad8f-4788-85b8-5427dd7873e4_B4, SystemTracker:myapp:队列:订单,时间戳:2019-04-29T22:31:57 TrackingId:9c3e0c40-4410-4102-a705-86a6528cd030_B4, SystemTracker:myapp:队列:订单,时间戳:2019-04-29T22:31:57 TrackingId:401a15d284ad44989f5e451c963d81e5_G16, SystemTracker:gateway7,时间戳:2019-04-29T22:31:57
UseAzureServiceBus
似乎是错误的,因为它正在使用队列
class Publisher
{
static void Main()
{
using (var activator = new BuiltinHandlerActivator())
{
Configure.With(activator)
.Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
.Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Order))
.Start();
activator.Bus.Advanced.Topics.Publish(Consts.Order, new StringMessage("Hello there, I'm a publisher!")).Wait();
}
}
UseAzureServiceBus
似乎是错误的,因为它正在使用队列。处理程序能够处理消息吗?
class Subscriber
{
static void Main()
{
using (var activator = new BuiltinHandlerActivator())
{
activator.Register(() => new Handler());
Configure.With(activator)
.Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
.Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Order))
.Routing(r => r.TypeBased().MapAssemblyOf<StringMessage>(Consts.Order))
.Start();
activator.Bus.Advanced.Topics.Subscribe(Consts.Order);
Console.WriteLine("This is Subscriber 1");
Console.WriteLine("Press ENTER to quit");
Console.ReadLine();
Console.WriteLine("Quitting...");
}
}
}
class Handler : IHandleMessages<StringMessage>, IHandleMessages<DateTimeMessage>, IHandleMessages<TimeSpanMessage>
{
public async Task Handle(StringMessage message)
{
Console.WriteLine("Got string: {0}", message.Text);
}
public async Task Handle(DateTimeMessage message)
{
Console.WriteLine("Got DateTime: {0}", message.DateTime);
}
public async Task Handle(TimeSpanMessage message)
{
Console.WriteLine("Got TimeSpan: {0}", message.TimeSpan);
}
}
上面的代码创建一个Order队列,这不是我想要的。
我想要一个主题,以及一个或两个订阅。
答案 0 :(得分:0)
Rebus几乎鼓励您使用.NET类型作为主题,在这种情况下,这意味着主题
messages_datetimemessage__messages
messages_stringmessage__messages
messages_timespanmessage__messages
被创建,因为您发布了DateTimeMessage
,StringMessage
和TimeSpanMessage
类型的事件(所有事件都驻留在Messages
程序集的Messages
名称空间中)
如果这不是您想要的,Rebus允许您像这样发布自定义主题:
await bus.Advanced.Publish("my-topic", new DateTimeMessage(...))`;
在这种情况下将导致创建单个主题:my-topic
。
订户将需要进行相应的订阅:
await bus.Advanced.Subscribe("my-topic");
请记住,没有过滤发布到某个主题的事件的类型,因此上面的订阅者将收到发布到my-topic
主题的任何内容,无论它是否能够处理它。