在公共交通中预定发布

Scheduled Publish in Mass Transit

我将 Mass Transit 与 .NET Core 3.1 和 Azure 服务总线结合使用。

我想在向主题发布消息时使用服务总线的预定传递功能。 AZSB 似乎很好地支持这一点,但我在尝试让 MT 做到这一点时遇到了问题。

我之前已成功将计划的消息发送到队列,但想改用 pub/sub。这是初始发送,因此不在消费者上下文中。

我现在已经达到 'schedule published' 一条消息的地步,它在消息上具有正确的 ScheduledTime 属性,并且消息类型是“urn:message:MassTransit.Scheduling:ScheduledMessage” .

但是,消息直接进入订阅以立即传递,而不是在主题内安排。

这是我的代码:

    private async Task<Result> PublishScheduledMessage(MyTask message, DateTime scheduledDelivery)
    {
        try
        {
            var endpoint = await _bus.GetPublishSendEndpoint<MyTask>();
            await _bus.SchedulePublish<ScheduledMessage>(endpoint, scheduledDelivery, message);
            return Result.Success();
        }
        catch (MassTransitException e)
        {
            _logger.Error(e, $"Error while trying to send scheduled MyTask.  Exception: {e.Message}");
            return Result.Failure(e.Message);
        }
    }

(我也试过发布 MyTask 类型而不是 ScheduledMessage,但没有区别)

我能找到的唯一文档是 here。但是scheduler接口没有Publish接口,只有send,所以看起来只会投递到queues? SchedulePublish 是否仅适用于 Rabbit 和 Quartz?

有人可以帮忙吗?

首先,MassTransit v7 在 IMessageScheduler 中内置了 SchedulePublish,因此您可以在升级后使用它。

同时,由于您使用的是 Azure 服务总线,您只需在发布时设置 ScheduledEnqueueTime 即可轻松安排发布,如下所示(使用扩展方法)。

bus.Publish<MyTask>(message, context =>
    context.SetScheduledEnqueueTime(delay));

这将为您设置 属性,这会将消息延迟到预定时间。基本上,调度程序正在做同样的事情。

当您使用 Azure 服务总线(而不是使用 Quartz 或 Hangfire)计划消息时,您根本不使用 ScheduleMessage 类型,它们仅用于外部消息计划程序。