当前位置: 首页 > 知识库问答 >
问题:

如何从Azure服务总线队列中删除/清除活动/死信消息?

郑胡媚
2023-03-14

是否需要删除/清除Azure门户中Azure服务总线队列中的活动/死信消息?目前,我们已经向队列发送了几条消息,而活动消息和一些死信消息都无缘无故地保留在那里,并且我们的服务总线用户没有以某种方式触发,因此我们希望删除这些消息,以使队列再次干净。为了等到服务总线在过期后丢弃这些消息,我们可以自己手动删除它们吗?

共有3个答案

宗波涛
2023-03-14

您可以为此调用服务总线API。使用DELETE方法将从队列中检索和删除消息。这里有官方文件。API是

https://{SERVICENAMESPACE}.servicebus.windows.net/{QUEUE_NAME}/$DeadLetterQueue/消息/头

...而且

https://{SERVICENAMESPACE}.servicebus.windows.net/{QUEUE_NAME}/消息/头

您可以使用下面的curl来接收和删除消息,编写一个while循环,以实现您的目标。SAS令牌可以按照官方文档进行检索。

curl -X DELETE -H "Authorization: SharedAccessSignature sr=<NAMESPACE NAME>.servicebus.windows.net&sig=<SHARED ACCESS KEY>&se=<TOKEN EXPIRY INSTANT>&skn=<SHARED KEY NAME>" ${URL}

获取SAS令牌代码:

    get_sas_token() {
    eval ${CONNECT_STRING}
    local EXPIRY=${EXPIRY:=$((60 * 60 * 1))} # Default token expiry is 1 hour
local ENCODED_URI=$(echo -n ${Endpoint} | jq -s -R -r @uri)
    local TTL=$(($(date +%s) + ${EXPIRY}))
    local UTF8_SIGNATURE=$(printf "%s\n%s" ${ENCODED_URI} ${TTL} | iconv -t utf8)
local HASH=$(echo -n "${UTF8_SIGNATURE}" | openssl sha256 -hmac ${SharedAccessKey} -binary | base64)
    local ENCODED_HASH=$(echo -n ${HASH} | jq -s -R -r @uri)
AUTH_HEADER="SharedAccessSignature sr=${ENCODED_URI}&sig=${ENCODED_HASH}&se=${TTL}&skn=${SharedAccessKeyName}"
}

删除死信队列(您可以更改URL以删除活动邮件):

purge_dlq_queue() {
    local DLQ_QUEUE_URL="https://${SERVICENAMESPACE}.servicebus.windows.net/${QUEUE_NAME}/\$DeadLetterQueue/messages/head"
    local count=1000
    echo "cleaning the dead letters messages from the message queue..."
while [[ ${count} -ge 0 ]]
    do
        local STATUS_CODE=$(curl -I -X DELETE -H "Authorization: ${AUTH_HEADER}" ${DLQ_QUEUE_URL} 2>/dev/null | head -n 1 | cut -d$' ' -f2)
        if [[ STATUS_CODE -ge 300 ]]; then
            echo "Exit dead letters message queue cleaning with code ${STATUS_CODE}"
            return 1
        elif [[ STATUS_CODE -eq 204 ]]; then
            echo "dead letters message queue has been cleaned"
            return 0
        fi
        let count--
    done
    echo "Exit with maxium number tries."
    return 1
}

可以从这里检查脚本代码

佴保臣
2023-03-14

在Azure门户中是否仍有从Azure服务总线队列中删除/清除活动/死信消息的方法?

当前不支持清除操作。有一个功能请求要实现清除,但尚未实现。

您可以使用一些工具执行类似清除的操作。ServiceBus Explorer可以清除常规队列和死信队列上的消息(接收和删除选项)。

或者,您也可以编写一个脚本来实现这一点。

林弘文
2023-03-14

使用Service Bus Explorer,您可以连接到Azure Service Bus并管理消息传递实体。你可以在这里下载这个工具。

下载工具后,请在服务总线资源管理器中运行“ServiceBusExplorer.exe”,然后转到文件连接

连接成功后,您将能够看到连接的服务总线中的所有主题队列选择您想要访问的队列

您可以根据需要接收和删除

 类似资料:
  • 我正在使用azure服务总线主题和订阅机制,并希望处理所有在死信队列中的消息。 此外,我想通过C#中的Azure Web作业处理消息,并将其发送回队列。所以我想知道如何通过我的应用程序处理死信队列上的消息?

  • > 在Azure Service Bus主题中,我有两个订阅subscription1和subscription2。我正在向主题发送一条消息。在subscription1中,消息被放弃,在subscription2中,消息被处理。subscription1中的已放弃消息是否将再次发送给两个订阅或仅发送给已放弃消息的订阅。 我也有点困惑,死信队列将是所有订阅都通用的,还是每个订阅都有一个单独的死信队

  • 使用WebJobs SDK时,将代理消息移动到死信队列的正确方法是什么?通常我会打电话给味精。死信()。但是,SDK负责管理代理消息的生命周期。它将调用msg。如果方法返回成功,则返回Complete(),如果发生异常,则将重试该消息。我需要第三种情况,告诉ServiceBus队列将消息移动到死信队列,因为它是一条坏消息。

  • 如何获取Azure服务总线队列中死信消息的数量? 我可以像这样得到队列中的计数。。。 但这看起来既包括队列中的消息,也包括关联死信队列中的消息 我如何区分它们?

  • 如果消息中毒,Azure服务总线队列触发函数将执行默认策略,将消息发送到死信队列。但是,我们是否可以手动将消息发送到死信队列?有几次,由于某种内部或业务异常,我们不希望Azure Function执行其默认策略,我们希望将其他信息绑定到消息,并手动将其发送到Azure服务总线截止日期队列。 在以前使用BrokeredMessage对象的版本中,有一个名为 然而,在最新的Functino 2中。十、

  • 我正在使用带有.NET核心的Azure服务总线 在我们的应用程序中,我们正在向服务总线发送会话消息。每当我们收到带有session-Id的取消请求时,我们需要删除/删除/完成带有该特定sessionId的消息,而不需要进行任何进一步的处理 但我得到了错误-请求的会话'session-name'不能被接受。它可能被另一个接收器锁定。