我将我的域事件持久化到我的数据库。我有一个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();
}
答案 0 :(得分:0)
如果Send
调用成功完成(无例外),则表示邮件已传递并且代理已接受该邮件。如果传递失败,Send
将抛出异常。
使用任何支持的Service Bus API客户端,始终明确解决向Service Bus发送操作的问题,这意味着API操作等待Service Bus的接受结果到达,然后完成发送操作。
旁注:在将许多消息发送到同一主题的现实代码中,您应该重用TopicClient
实例,而不是为每条消息创建和关闭它。它也是线程安全的。