我如何知道或确认Azure服务总线收到了代理消息?

时间:2017-10-23 16:15:50

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

我将我的域事件持久化到我的数据库。我有一个webjob,它读取这些事件,然后将它们转发到正确的队列/主题,然后在db中将消息标记为IsForwarded。

我的问题是TopicClient.Send()和QueueClient.Send()是否保证传递,如果传递失败,它是否保证异常,以便我的webjob转发事件不会更新数据库?基本上,我想知道如何保证服务总线接收消息。

我目前向队列/主题发送消息的方法是:

        private void PublishMessage(MessageQueue message, string queueName)
    {
        this.InitializeEventQueue(queueName, null);
        var client = TopicClient.CreateFromConnectionString(_connectionString, queueName);
        var brokeredMessage = this.CreateBrokeredMessage(message, message.MessageId.ToString());
        client.Send(brokeredMessage);
        client.Close();
    }

Webjob:

        var groups = this.GetNewMessages()
            .GroupBy(a => new { a.DuplicationDetectionId, a.TypeName });

        foreach (var group in groups)
        {

            //get the most recent message, which would be the last one of the group
            var message = group.OrderBy(a => a.CreateDate).Last();

            var queueName = this.GetQueueName(message.TypeName);
            this._messagingService.PublishMessage(message, queueName, 0);

            message.MarkAsForwarded();
            this._dbContext.Entry(message).State = EntityState.Modified;

            //mark as forwarded
            foreach (var storedEvent in group.Where(a => !a.IsForwarded))
                storedEvent.Delete();

            this._dbContext.SaveChanges();

        }

1 个答案:

答案 0 :(得分:0)

如果Send调用成功完成(无例外),则表示邮件已传递并且代理已接受该邮件。如果传递失败,Send将抛出异常。

  

使用任何支持的Service Bus API客户端,始终明确解决向Service Bus发送操作的问题,这意味着API操作等待Service Bus的接受结果到达,然后完成发送操作。

docs

旁注:在将许多消息发送到同一主题的现实代码中,您应该重用TopicClient实例,而不是为每条消息创建和关闭它。它也是线程安全的。