You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Function App/Shell/PowerShell实现Azure Service Bus死信队列通知?

实现Azure Service Bus死信队列新消息通知的三种方案

针对你需要每小时检查死信队列、有新消息时触发邮件通知的需求,以下是三种可行的实现方式:


一、Azure Function App(推荐)

利用定时器触发器实现定时检查,集成Azure服务更稳定,无需维护本地/服务器环境。

步骤与代码示例(PowerShell触发器)

  1. 创建定时器触发的Function App,设置CRON表达式为0 0 * * * *(每小时执行一次)
  2. 在Function App的「应用设置」中添加以下密钥:
    • ServiceBusConnectionString:Service Bus命名空间的连接字符串
    • StorageConnectionString:用于记录历史计数的存储账户连接字符串
    • SmtpPassword:邮件发送账号的密码
  3. 编写Function逻辑:
param($Timer)

# 配置核心参数
$serviceBusNamespace = "你的命名空间名称"
$queueName = "目标队列名称"
$deadLetterQueueName = "$queueName/$DeadLetterQueue"
$resourceGroupName = "资源组名称"
$storageContainer = "dlq-count-logs"
$blobName = "last-dlq-count.txt"

# 获取上次记录的死信消息数
$lastCount = 0
try {
    $storageContext = New-AzStorageContext -ConnectionString $env:StorageConnectionString
    Get-AzStorageBlobContent -Container $storageContainer -Blob $blobName -Context $storageContext -Destination "./$blobName" -Force | Out-Null
    $lastCount = [int](Get-Content "./$blobName")
} catch {
    Write-Host "首次运行,无历史记录,初始计数设为0"
}

# 获取当前死信队列的消息数量
$dlqQueue = Get-AzServiceBusQueue -ResourceGroupName $resourceGroupName -NamespaceName $serviceBusNamespace -QueueName $deadLetterQueueName
$currentCount = $dlqQueue.CountDetails.ActiveMessageCount

# 检测新消息并发送通知
if ($currentCount -gt $lastCount) {
    $subject = "Azure Service Bus死信队列新增消息"
    $body = "死信队列`"$deadLetterQueueName`"新增了$($currentCount - $lastCount)条消息`n当前总数量:$currentCount`n检查时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
    
    # 发送邮件(以Office 365 SMTP为例)
    Send-MailMessage -SmtpServer "smtp.office365.com" -Port 587 `
        -From "你的发件邮箱" -To "收件邮箱" `
        -Subject $subject -Body $body -UseSsl `
        -Credential (New-Object System.Management.Automation.PSCredential("你的发件邮箱", (ConvertTo-SecureString $env:SmtpPassword -AsPlainText -Force)))
}

# 更新历史计数到存储Blob
Set-Content "./$blobName" $currentCount
Set-AzStorageBlobContent -Container $storageContainer -Blob $blobName -Context $storageContext -File "./$blobName" -Force | Out-Null

二、PowerShell脚本(本地/Windows任务计划)

适合需要在本地或Windows服务器上运行的场景,用任务计划实现定时执行。

代码示例

# 配置参数
$serviceBusNamespace = "你的命名空间名称"
$queueName = "目标队列名称"
$resourceGroupName = "资源组名称"
$deadLetterQueueName = "$queueName/$DeadLetterQueue"
$countLogPath = "C:\dlq-monitor\last-count.txt"

# 登录Azure(本地运行需执行,自动化场景可改用服务主体登录)
# Connect-AzAccount

# 获取上次计数
$lastCount = 0
if (Test-Path $countLogPath) {
    $lastCount = [int](Get-Content $countLogPath)
}

# 获取当前死信队列消息数
$dlqQueue = Get-AzServiceBusQueue -ResourceGroupName $resourceGroupName -NamespaceName $serviceBusNamespace -QueueName $deadLetterQueueName
$currentCount = $dlqQueue.CountDetails.ActiveMessageCount

# 发送通知
if ($currentCount -gt $lastCount) {
    $subject = "Azure Service Bus死信队列新增消息"
    $body = "死信队列`"$deadLetterQueueName`"新增了$($currentCount - $lastCount)条消息`n当前总数量:$currentCount`n检查时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
    
    Send-MailMessage -SmtpServer "smtp.office365.com" -Port 587 `
        -From "你的发件邮箱" -To "收件邮箱" `
        -Subject $subject -Body $body -UseSsl `
        -Credential (New-Object System.Management.Automation.PSCredential("你的发件邮箱", (ConvertTo-SecureString "你的SMTP密码" -AsPlainText -Force)))
}

# 更新计数日志
Set-Content $countLogPath $currentCount

定时配置

打开「Windows任务计划程序」,创建任务:

  • 触发器:每小时执行一次
  • 操作:启动程序,选择powershell.exe,参数填-File "C:\path\to\your\script.ps1"

三、Shell脚本(Linux/macOS/Cron)

适合Linux环境,用Azure CLI获取队列信息,Cron实现定时执行。

代码示例

#!/bin/bash

# 配置参数
SERVICE_BUS_NAMESPACE="你的命名空间名称"
QUEUE_NAME="目标队列名称"
RESOURCE_GROUP="资源组名称"
DEAD_LETTER_QUEUE="$QUEUE_NAME/\$DeadLetterQueue"
COUNT_LOG="/var/log/dlq-last-count.txt"

# 获取上次计数
if [ -f "$COUNT_LOG" ]; then
    LAST_COUNT=$(cat "$COUNT_LOG")
else
    LAST_COUNT=0
fi

# 获取当前死信队列消息数(Azure CLI)
CURRENT_COUNT=$(az servicebus queue show --resource-group "$RESOURCE_GROUP" --namespace-name "$SERVICE_BUS_NAMESPACE" --name "$DEAD_LETTER_QUEUE" --query 'countDetails.activeMessageCount' -o tsv)

# 发送通知
if [ "$CURRENT_COUNT" -gt "$LAST_COUNT" ]; then
    SUBJECT="Azure Service Bus死信队列新增消息"
    BODY="死信队列\"$DEAD_LETTER_QUEUE\"新增了$((CURRENT_COUNT - LAST_COUNT))条消息\n当前总数量:$CURRENT_COUNT\n检查时间:$(date +'%Y-%m-%d %H:%M:%S')"
    
    # 用ssmtp发送邮件(需提前安装ssmtp并配置)
    echo -e "From: 你的发件邮箱\nTo: 收件邮箱\nSubject: $SUBJECT\n\n$BODY" | ssmtp -au "你的发件邮箱" -ap "你的SMTP密码" -s "smtp.office365.com:587" "收件邮箱"
fi

# 更新计数日志
echo "$CURRENT_COUNT" > "$COUNT_LOG"

定时配置

  1. 安装依赖:sudo apt-get install ssmtp
  2. 配置ssmtp:编辑/etc/ssmtp/ssmtp.conf,添加:
    mailhub=smtp.office365.com:587
    AuthUser=你的发件邮箱
    AuthPass=你的SMTP密码
    UseSTARTTLS=YES
    
  3. 设置Cron定时:crontab -e,添加0 * * * * /path/to/your/script.sh(每小时执行)

内容的提问来源于stack exchange,提问作者Dur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:40:56