Azure服务总线订阅客户端.OnMessage总是在不应该完成的时候完成消息
本文关键字:不应该 消息 候完成 总线 服务 客户端 OnMessage Azure | 更新日期: 2023-09-27 18:10:45
我正在尝试接收给定订阅到服务总线主题的所有消息,但对于此应用程序的上下文,我不希望它们此时死信,我只想查看它们并将它们留在订阅上。尽管将客户端实例化为
SubscriptionClient sc = SubscriptionClient.CreateFromConnectionString(connectionString, sub.topicName, sub.subscriptionName, ReceiveMode.PeekLock);
并确保我使用的是message. abandon()而不是message. complete()在访问消息后消息总是变成死信。我也有选择。自动完成设置为false
完整方法代码如下:
public List<ServiceBusMessage> RetrieveSubscriptionMessages(Subscription sub) {
ServiceBusMessage sbm;
List<ServiceBusMessage> list = new List<ServiceBusMessage>();
String connectionString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"].ToString();
SubscriptionClient sc = SubscriptionClient.CreateFromConnectionString(connectionString, sub.topicName, sub.subscriptionName, ReceiveMode.PeekLock);
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
sc.OnMessage((message) => {
try {
sbm = new ServiceBusMessage() {
topicName = sub.topicName,
messageText = message.GetBody<String>()
};
list.Add(sbm);
message.Abandon();
}
catch (Exception) {
message.Abandon();
throw;
}
}, options);
return list;
}
我错过了什么吗?或者onMessage()方法是否存在自动死信的问题?
谢谢!
当消息被放弃时,服务总线将立即使其可用,以便重新交付给主题的任何订阅者。
如果您正在尝试配置多播机制,其中多个侦听器都接收相同的消息,那么要理解给定订阅上的所有侦听器都将竞争相同的消息。为了让每个侦听器接收自己的消息副本,只需为每个侦听器创建对主题的唯一订阅。
如果你的意图是延迟被放弃的消息的重新交付,你可以看看SO问题:放弃Azure SB消息的正确方法是什么,以便它在将来以一种我可以控制的方式再次可见?