一尘不染

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

sql

这是我的第一个问题!因此,我希望我提供足够的信息:

我们正尝试利用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

这让我有些困惑,我在Broker运行时运行了Query Profiler,一切似乎都很好。

我执行了这个:

    从sys.dm_broker_queue_monitors中选择*

显示中间状态为NOTIFIED的代理队列。此“ NOTIFIED”状态似乎表明激活sp无效,但日志未指出这一点,因此我检查了以下所有内容,但没有任何提示:

    从sys.transmission_queue中选择*;
    从sys.conversation_endpoints中选择*;
    从sys.dm_broker_activated_tasks中选择*;
    从sys.dm_broker_connections中选择*;

如果我运行以下命令:

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

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

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

    事件类型:错误
    事件源:DatabaseMail
    事件类别:无
    事件ID:0
    日期:2011年9月19日
    时间:5:18:44 PM
    用户:N / A
    电脑: _____
    描述:
    连接出现错误。原因:超时已过期。从池中获取连接之前已经经过了超时时间。发生这种情况的原因是所有池化连接都在使用中,并且达到了最大池大小。
    超时时间已到。从池中获取连接之前已经经过了超时时间。发生这种情况的原因是所有池化连接都在使用中,并且达到了最大池大小。

并与之一起运行(如果我运行):“从dbo.sysmail_log中选择*”;我在这篇文章的顶部看到了很长的超时错误列表。我还发现,当所有这些错误发生时,它会关闭Broker
Service(我认为这是消息中毒),因此,我需要运行sysmail_stop_sp并开始使其再次运行。

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

查尔斯


阅读 134

收藏
2021-05-30

共1个答案

一尘不染

我也遇到过类似的问题,但不幸的是没有得到答案。最后,我所能做的就是监视QUEUE,当它崩溃时,只需重新启动它即可。我使用以下存储过程来做到这一点。

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

希望对您有所帮助。如果是这样,请记住将其标记为答案!

亲切的问候,威廉

2021-05-30