如何通过Function App/Shell/PowerShell实现Azure Service Bus死信队列通知?
实现Azure Service Bus死信队列新消息通知的三种方案
针对你需要每小时检查死信队列、有新消息时触发邮件通知的需求,以下是三种可行的实现方式:
一、Azure Function App(推荐)
利用定时器触发器实现定时检查,集成Azure服务更稳定,无需维护本地/服务器环境。
步骤与代码示例(PowerShell触发器)
- 创建定时器触发的Function App,设置CRON表达式为
0 0 * * * *(每小时执行一次) - 在Function App的「应用设置」中添加以下密钥:
ServiceBusConnectionString:Service Bus命名空间的连接字符串StorageConnectionString:用于记录历史计数的存储账户连接字符串SmtpPassword:邮件发送账号的密码
- 编写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"
定时配置
- 安装依赖:
sudo apt-get install ssmtp - 配置ssmtp:编辑
/etc/ssmtp/ssmtp.conf,添加:mailhub=smtp.office365.com:587 AuthUser=你的发件邮箱 AuthPass=你的SMTP密码 UseSTARTTLS=YES - 设置Cron定时:
crontab -e,添加0 * * * * /path/to/your/script.sh(每小时执行)
内容的提问来源于stack exchange,提问作者Dur
相关产品推荐
相关产品推荐

