在我的场景中,我已经在应用程序中实现了Rebus(使用azure服务总线)(打算使用sagas进行PoC)。
问题是,我正在听的主题仅是天蓝色的servicebus,没有幻想。
我正在订阅主题,将消息移到队列中并出现此错误:
Rebus.Exceptions.RebusApplicationException: Received message with empty or absent 'rbs2-msg-id' header! All messages must be supplied with an ID . If no ID is present, the message cannot be tracked between delivery attempts, and other stuff would also be much harder to do - therefore, it is a requirement that messages be supplied with an ID.
是否有一种方法可以在邮件到达队列之前对其进行修饰,以将其转换为Rebus可以接受的内容?
还是我必须有一条单独的总线来处理这些消息,然后将它们作为与Rebus兼容的消息重新发送到主题/队列?
答案 0 :(得分:1)
该错误消息来自SimpleRetryStrategyStep
,通常是在Rebus的incoming messages pipeline中执行的第一步。
您可以选择的一种方法是在接收者的Rebus实例中装饰ITransport
,这将为您提供一个提供消息ID的位置。可以这样完成:
Configure.With(...)
.Transport(t => {
t.UseAzureServiceBus(...);
t.Decorate(c => new MyTransportDecorator(t.Get<ITransport>()))
})
.Start();
其中MyTransportDecorator
是一个看起来像这样的装饰器:
class MyTransportDecorator : ITransport
{
readonly ITransport _transport;
public MyTransportDecorator(ITransport transport) => _transport = transport;
public void CreateQueue(string address) => _transport.CreateQueue(address);
public Task Send(string destinationAddress, TransportMessage message, ITransactionContext context)
=> _transport.Send(destinationAddress, message, context);
public async Task<TransportMessage> Receive(ITransactionContext context, CancellationToken cancellationToken)
{
var message = await _transport.Receive(context, cancellationToken);
if (message == null) return null;
ProvideMessageIdSomehow(message);
return message;
}
public string Address => _transport.Address;
}
其中ProvideMessageIdSomehow
然后添加所需的标题。