如何从Azure Service Bus队列中删除/清除活动/死信消息?

时间:2019-09-06 04:25:25

标签: azure azureservicebus azure-servicebus-queues

是否仍然要从Azure门户中的Azure Service Bus队列删除/清除活动/死信消息?目前,我们已经向队列发送了几条消息,而活动消息和一些死信消息却毫无保留,并且我们的服务总线订户没有以某种方式触发,因此我们想删除这些消息以使我们的队列再次干净。为了等到服务总线在到期后丢弃这些消息,我们可以手动将其删除吗?

3 个答案:

答案 0 :(得分:2)

使用Service Bus资源管理器可以连接到Azure Service Bus并管理消息传递实体。您可以下载工具here

下载工具后,运行“ ServiceBusExplorer.exe” 在Service Bus Explorer中,转到File Connect

enter image description here

输入可以在其中找到的连接字符串 仪表板->服务总线->->共享访问策略  enter image description here

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

enter image description here

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

enter image description here

答案 1 :(得分:0)

  

是否仍然要从Azure门户中的Azure Service Bus队列删除/清除活动/死信消息?

当前不支持清除操作。有feature request可以实现清除,但是尚未实现。

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

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

答案 2 :(得分:-2)

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

<块引用>

https://{SERVICENAMESPACE}.servicebus.windows.net/{QUEUE_NAME}/$DeadLetterQueue/messages/head

。还有

<块引用>

https://{SERVICENAMESPACE}.servicebus.windows.net/{QUEUE_NAME}/messages/head

您可以使用如下 curl 来接收和删除消息,为此编写一个 while 循环可以实现您的目标。 SAS token可以按照官方文档获取。

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
}

脚本代码可以从here

查看