对于来自Azure服务总线中的死信队列的已接收消息(ServiceBusReceivedMessage),ApplicationProperties为空

pinkon5k  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(137)

库名称和版本

Azure.Messaging.ServiceBus 7.10.0

描述bug

我们尝试用两种不同的方式修改消息死信的元数据:
1.使用以下方法修改自定义属性。DeadLetterMessageAsync(ServiceBusReceivedMessage message,IDictionary〈string,object〉propertiesToModify = default,CancellationToken cancellationToken = default)我们已经创建了一个自定义字典,其中包含要在字典中修改的属性,并将其传递给上面的参数。(键,值)得到反映。
然而,当尝试从死信队列接收消息作为ServiceBusReceivedMessage并检查applicationProperties字段时,字典(ApplicationProperties)根本没有任何键值对。
1.我们还尝试了另一种方法DeadLetterMessageAsync(ServiceBusReceivedMessage message,string deadLetterReason,string deadLetterErrorDescription = default,CancellationToken cancellationToken = default)我们用某个消息修改了ErrorDescription,并对其进行了deadLettering。Post在接收消息时,它根本没有deadLetterErrorDescription。从库源代码来看,看起来deadLetterErrorDescription字段是从ApplicationProperties中提取的,该字段又是空的。

预期行为

在场景#1和#2中,我们都希望接收到的消息中的applicationProperties与门户中显示的自定义属性相结合。

实际行为

ServiceBusReceivedMessage中的ApplicationProperties字段为空。

复制步骤

向死信队列发送一条带有错误描述的消息,并尝试从死信队列接收消息。尝试从applicationProperties读取是否有任何键。
在github空间也提到了这个:https://github.com/Azure/azure-sdk-for-net/issues/35443
编辑:这是一个错误的标注。在任何版本中都没有错误。

9w11ddsr

9w11ddsr1#

当消息是死信时,消息连同死信的原因和错误描述一起被移动到死信队列。dead-letter reasonerror description被添加到消息属性中。
谢谢@Sean Feldman的评论。
您需要安装NuGet Azure.Messaging.ServiceBus -Version 7.13.1

我尝试了下面的方法,并能够读取属性。
插入消息到服务总线队列,并读取消息,并使用以下代码将其移动到死信队列。

读取消息的示例代码。

string connSB = "Connection";
string que = "myqueue11";
string Remove_msg = "Hello";  
QueueClient Qclnt = new QueueClient(connSB, que);
MessageReceiver msgRcvr = new MessageReceiver(connSB, que, ReceiveMode.PeekLock);
        while (true)
        {
            Message message = await msgRcvr.ReceiveAsync();
            if (message == null || message.Body == null || message.Body.Length == 0)
            {
                break;
            }
            string messageContent = Encoding.UTF8.GetString(message.Body);
            if ((messageContent.Contains(Remove_msg)))
            {
                await msgRcvr.AbandonAsync(message.SystemProperties.LockToken);
                Console.WriteLine($"Item '{Remove_msg}' not found.");
            }
        }

        await Qclnt.CloseAsync();
        await msgRcvr.CloseAsync();

用C#编写代码以读取属性。

string connSB = @"Conn String";
string queue = "myqueue11";
ServiceBusClient clnt = new ServiceBusClient(connSB);
ServiceBusReceiver receiver = clnt.CreateReceiver(queue, new ServiceBusReceiverOptions
            {
                    SubQueue = SubQueue.DeadLetter
            });
            ServiceBusReceivedMessage msg = await receiver.ReceiveMessageAsync();
            if (msg == null)
            {
                    Console.WriteLine("No messages available in the dead-letter queue.");
            }

     else
        {
            if (msg.ApplicationProperties.Count > 0)
              {
                 foreach (KeyValuePair<string, object> prop in msg.ApplicationProperties)
                  {
                      Console.WriteLine($"Key: {prop.Key}, Value: {prop.Value}");
                  }
                }
             else
              {
                  Console.WriteLine("No ApplicationProperties found for the message.");
               }
                await receiver.CloseAsync();
                await clnt.DisposeAsync();
          }

死信队列属性。

相关问题