1)问题,Class MessageA 基类,Class MessageB继承自MessageA;
用bus.Publish方法本想把有些消息只发给B队列,结果由于其继承关系A队列也获得了消息;
解决方法用send,
Uri uri = new Uri(RabbitMqUriQueueB);
var endPoint = await _bus.GetSendEndpoint(uri);
await endPoint.Send(MessageB);
2)在rabbitmq中设置
把B类型unbind掉,应该就可以了;
3)可能的其他方式
Message Topology · MassTransit
Message types are extensively leveraged in MassTransit, so making it easy to configure how those message types are used by topology seemed obvious.
MassTransit 的exchanges,topics名称默认是消息名称,可以通过如下改为别名.
Bus.Factory.CreateUsingRabbitMq(cfg =>{
cfg.Message(x => {
x.SetEntityName("omg-we-got-one");
});
});
It's also possible to create a message-specific entity name formatter, by implementing IMessageEntityNameFormatter
and specifying it during configuration.
class FancyNameFormatter :
IMessageEntityNameFormatter
{
public string FormatEntityName()
{
// seriously, please don't do this, like, ever.
return type(T).Name.ToString();
}
}
Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Message(x =>
{
x.SetEntityNameFormatter(new FancyNameFormatter());
});
});
It's also possible to replace the entity name formatter for the entire topology.
class FancyNameFormatter :
IMessageEntityNameFormatter
{
public string FormatEntityName()
{
// seriously, please don't do this, like, ever.
return type(T).Name.ToString();
}
}
class FancyNameFormatter :
IEntityNameFormatter
{
public FancyNameFormatter(IEntityNameFormatter original)
{
_original = original;
}
public string FormatEntityName()
{
if(T is OrderSubmitted)
return "we-got-one";
return _original.FormatEntityName();
}
}
Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Message(x =>
{
x.SetEntityNameFormatter(new FancyNameFormatter(cfg.MessageTopology.EntityNameFormatter));;
});
});
通过EntityName 熟悉修改消息名称
[EntityName("order-submitted")]
public record LegacyOrderSubmittedEvent{}
ConfigureConsumeTopology 可选属性,设置后决定这个消息类型对应的topic或exchange是否应该被创建并订阅到这个队列。
[ConfigureConsumeTopology(false)]
public record DeleteRecord{}
ExcludeFromTopology 可选属性,决定这个消息类型实例发布时,这个消息的 topic 或 exchange 是否被创建。
如下例子中发布 ReformatHardDrive
命令不会在broker上创建 ICommand
topic or exchange。
[ExcludeFromTopology]
public interface ICommand{}
public record ReformatHardDrive : ICommand{}
不使用属性,可以在配置时设置:
...UsingRabbitMq((context,cfg) =>
{
cfg.Publish(p => p.Exclude = true);
});