【发布时间】:2018-01-23 12:52:49
【问题描述】:
我有一个当前主题队列,它将一些消息发送到死信队列。我正在创建另一个 Webjob,它在死信队列上侦听 ServiceBusTrigger。目的是将deadletter mesg重新提交到原始队列进行重新处理
当有新消息进入死信队列时,我会克隆该消息并将其发送回原始主题订阅以重新处理。
我希望克隆消息将被发送到原始队列并一直留在那里直到它被处理,但是一旦调用 [originalTopicClient.Send(cloneMessage);] 函数,消息就会完成。
我错过了什么吗?
public void ProcessQueueMessage([ServiceBusTrigger(topicName, dlqSubscription)] string message, TextWriter log)
{
MessagingFactory factory = MessagingFactory.Create(ServiceURI, tokenProvider);
string deadLetterQueuePath = SubscriptionClient.FormatDeadLetterPath(topicName, SubscriptionName);
SubscriptionClient dlqSubscriptionClient = factory.CreateSubscriptionClient(topicName, "mytopicsubscription/$DeadLetterQueue");
QueueClient deadletterQueueClient = factory.CreateQueueClient(deadLetterQueuePath);
BrokeredMessage cloneMessage;
Microsoft.ServiceBus.Messaging.TopicClient originalTopicClient = Microsoft.ServiceBus.Messaging.TopicClient.CreateFromConnectionString(serviceBusEndpoint, topicName);
BrokeredMessage dlqMessage;
if ((dlqMessage = dlqSubscriptionClient.Receive()) != null)
{
cloneMessage = dlqMessage.Clone();
cloneMessage.Properties.Remove("DeadLetterReason");
cloneMessage.Properties.Remove("DeadLetterErrorDescription");
originalTopicClient.Send(cloneMessage); //resend the clone message to original queue
dlqMessage.Complete(); //deadletter queue mesg completed
}
}
【问题讨论】:
-
您是否检查过您尝试克隆的消息是否未过期?或许你可以尝试在发送前设置它的 TTL 属性。
-
嗨@Peter,实际上我在发送克隆消息之前已经输入了 TTL。 cloneMessage.TimeToLive = new TimeSpan(0, 10, 0);
标签: azure servicebus