超时错误 - 通过 SQL Mail 发送邮件 - Service Broker 队列

2024-03-16

这是我的第一个问题!所以我希望我提供足够的信息:

我们尝试利用 SQL Mail Service Broker 发送大约 1000 封电子邮件。我们对此还比较陌生,但遇到了这个问题:

一些背景:

我们创建了一个 Profile、一个 Account 和一个 ProfileAccount 条目,并启用数据库邮件。然后我们用几封电子邮件进行了测试,一切正常。然后,我们创建了一个存储过程,我们将从项目中调用该存储过程,以使用 msdb.dbo.sp_send_dbmail 对所有电子邮件进行排队。效果很好,我们可以在 msdb.dbo.sysmail_mailitems 中看到所有邮件成功排队。然后,Service Broker 就会采取行动并开始处理电子邮件。

问题:

发送大约 90 个左右(绝不是相同的数字)后,sql 事件日志中会多次报告错误

由于邮件原因,邮件无法发送给收件人 服务器故障。(使用帐户 42 发送邮件 (2011-09-19T17:20:09)。 异常消息:无法将邮件发送到邮件服务器。 (操作 已超时。)。使用帐户 42 发送邮件 (2011-09-19T17:21:59)。 异常消息:无法将邮件发送到邮件服务器。 (发送失败 邮件。)。 )

我参考了这个网站寻求帮助:http://www.sqlteam.com/article/how-to-troubleshoot-service-broker-problems http://www.sqlteam.com/article/how-to-troubleshoot-service-broker-problems

这让我有点困惑,我在代理运行时运行了查询分析器,一切看起来都很好。

我执行了这个:




    select * from sys.dm_broker_queue_monitors

  

它显示了状态为 NOTIFIED 的代理队列。 这种“NOTIFIED”状态似乎意味着激活 sp 不起作用,但日志没有表明这一点,我检查了以下所有内容,但没有给我任何线索:




    select * from sys.transmission_queue;
    select * from sys.conversation_endpoints;
    select * from sys.dm_broker_activated_tasks;
    select * from sys.dm_broker_connections;

  

如果我运行以下命令:




    EXEC msdb.dbo.sysmail_stop_sp;
    EXEC msdb.dbo.sysmail_start_sp;

  

经纪人再次启动,同样的事情发生。

Windows 事件日志似乎显示了最有用的消息,但我不确定如何解决它:




    Event Type: Error
    Event Source:   DatabaseMail
    Event Category: None
    Event ID:   0
    Date:       9/19/2011
    Time:       5:18:44 PM
    User:       N/A
    Computer:   _____
    Description:
    There was an error on the connection. Reason: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.
    Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.

  

除此之外,如果我运行以下命令:“select * from dbo.sysmail_log;”我看到了我在这篇文章顶部显示的一长串超时错误。我还发现,当所有这些错误发生时,它会关闭代理服务(我认为它被称为消息中毒),因此我需要运行 sysmail_stop_sp 并开始让它再次运行。

感谢您的帮助,我希望我提供了足够的信息。

Charles


我也遇到过类似的问题,但不幸的是从未得到答案。最后,我所能做的就是监视队列,当它崩溃时重新启动它。我使用以下存储过程来执行此操作。

DECLARE @state nvarchar(50),
        @length int,
        @last_activated_time datetime
CREATE TABLE #MailStatusTempTable
(
[queue_type] nvarchar(max),
[length] int,
[state] nvarchar(max),
[last_empty_rowset_time] datetime,
[last_activated_time] datetime
)
INSERT INTO #MailStatusTempTable EXEC msdb.dbo.sysmail_help_queue_sp @queue_type = 'mail'
SELECT TOP 1 @state = [State],@length=[length],@last_activated_time = [last_activated_time] FROM #MailStatusTempTable
DROP TABLE #MailStatusTempTable
IF (@length>0)
BEGIN
    IF (@state <> 'RECEIVES_OCCURRING')
    BEGIN
        IF (DATEDIFF(minute,@last_activated_time,GETDATE())>5) --ensuring 5 minutes has passed since last activity (your timeout might be different)
        BEGIN
            EXEC msdb.dbo.sysmail_stop_sp
            EXEC msdb.dbo.sysmail_start_sp
        END
    END
END

我希望这对你有一些帮助。如果是这样,请记住将此标记为答案!

亲切的问候, 威廉

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超时错误 - 通过 SQL Mail 发送邮件 - Service Broker 队列 的相关文章

随机推荐