重新聆听纯天蓝色的服务总线

时间:2019-09-09 08:06:49

标签: azureservicebus rebus azure-servicebus-topics rebus-azureservicebus

在我的场景中,我已经在应用程序中实现了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兼容的消息重新发送到主题/队列?

1 个答案:

答案 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然后添加所需的标题。