如何从 Azure 服务总线队列 delete/clear active/dead-letter 消息?
How to delete/clear active/dead-letter messages from Azure Service Bus Queue?
是否有 delete/clear 来自 Azure 门户中 Azure 服务总线队列的 active/dead-letter 消息?目前我们已经向我们的队列发送了几条消息,而活动消息和一些死信消息都在那里无所事事,我们的服务总线订阅者没有以某种方式触发,所以我们想删除这些消息以使我们的队列又干净了。为了等到服务总线在过期后丢弃这些消息,我们可以自己手动删除它们吗?
Is there anyway to delete/clear either the active/dead-letter messages from Azure Service Bus Queue in Azure portal?
目前不支持清除操作。有一个 feature request 来实现清除,但还没有实现。
您可以使用一些工具来执行类似清除的操作。 ServiceBus Explorer 可以清除常规队列和死信队列上的消息(接收和删除选项)。
或者,您也可以编写一个脚本来执行此操作。
使用服务总线资源管理器,您可以连接到 Azure 服务总线并管理消息传递实体。您可以下载该工具here。
下载该工具后,您 运行“ServiceBusExplorer.exe”
在服务总线资源管理器中,转到文件连接
输入连接字符串,您可以在
仪表板 --> 服务总线 --> --> 共享访问策略
成功连接后,您将能够看到连接的服务总线中的所有主题队列select您想要访问的队列
您可以随意接收和删除
您可以为此调用服务总线 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
查看
您可以使用基于 Windows 的商业工具 QueueExplorer 删除消息:
是否有 delete/clear 来自 Azure 门户中 Azure 服务总线队列的 active/dead-letter 消息?目前我们已经向我们的队列发送了几条消息,而活动消息和一些死信消息都在那里无所事事,我们的服务总线订阅者没有以某种方式触发,所以我们想删除这些消息以使我们的队列又干净了。为了等到服务总线在过期后丢弃这些消息,我们可以自己手动删除它们吗?
Is there anyway to delete/clear either the active/dead-letter messages from Azure Service Bus Queue in Azure portal?
目前不支持清除操作。有一个 feature request 来实现清除,但还没有实现。
您可以使用一些工具来执行类似清除的操作。 ServiceBus Explorer 可以清除常规队列和死信队列上的消息(接收和删除选项)。
或者,您也可以编写一个脚本来执行此操作。
使用服务总线资源管理器,您可以连接到 Azure 服务总线并管理消息传递实体。您可以下载该工具here。
下载该工具后,您 运行“ServiceBusExplorer.exe” 在服务总线资源管理器中,转到文件连接
输入连接字符串,您可以在
仪表板 --> 服务总线 --> --> 共享访问策略
成功连接后,您将能够看到连接的服务总线中的所有主题队列select您想要访问的队列
您可以随意接收和删除
您可以为此调用服务总线 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
查看您可以使用基于 Windows 的商业工具 QueueExplorer 删除消息: