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

超时错误-通过SQL邮件发送邮件-Service Broker队列,sql,timeout,service-broker,Sql,Timeout,Service Broker,这是我的第一个问题!因此,我希望提供足够的信息: 我们正试图利用SQL邮件服务代理发送大约1000封电子邮件。我们对这方面还比较陌生,但遇到了这个问题: 一些背景: 我们创建了一个Profile、一个Account和一个ProfileAccount条目,并启用了数据库邮件。然后我们通过几封电子邮件进行了测试,结果都很好。然后,我们创建了一个存储过程,我们将从项目中调用该过程,使用msdb.dbo.sp_send_dbmail将所有电子邮件排队。这很好,我们可以在msdb.dbo.sysmail\

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

我们正试图利用SQL邮件服务代理发送大约1000封电子邮件。我们对这方面还比较陌生,但遇到了这个问题:

一些背景:

我们创建了一个Profile、一个Account和一个ProfileAccount条目,并启用了数据库邮件。然后我们通过几封电子邮件进行了测试,结果都很好。然后,我们创建了一个存储过程,我们将从项目中调用该过程,使用msdb.dbo.sp_send_dbmail将所有电子邮件排队。这很好,我们可以在msdb.dbo.sysmail\u mailtimes中看到所有邮件成功排队。然后服务代理启动并开始处理电子邮件

问题:

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

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

我参考此网站寻求帮助:

这让我有点困惑,我在代理运行时运行了查询探查器,一切似乎都很好

我执行了以下命令:

select * from sys.dm_broker_queue_monitors 从sys.dm\u broker\u queue\u监视器中选择* 它显示了代理队列,状态为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; 从sys.transmission\u队列中选择*; 从sys.conversation_端点中选择*; 从sys.dm_broker_activated_tasks中选择*; 从sys.dm_broker_connections中选择*; 如果我运行以下命令:

EXEC msdb.dbo.sysmail_stop_sp; EXEC msdb.dbo.sysmail_start_sp; EXEC msdb.dbo.sysmail\u stop\u sp; EXEC msdb.dbo.sysmail\u start\u 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. 事件类型:错误 事件源:DatabaseMail 活动类别:无 事件ID:0 日期:2011年9月19日 时间:下午5:18:44 用户:不适用 计算机:_____ 说明: 连接出错。原因:超时已过期。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且已达到最大池大小。 超时已过期。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且已达到最大池大小。 同时,如果我运行以下命令:“select*from dbo.sysmail_log;”我会看到我在本文顶部显示的一长串超时错误。我还发现,当所有这些错误发生时,它会关闭代理服务(我认为它被称为消息中毒),因此我需要运行sysmail_stop_sp并开始重新运行

谢谢你的帮助,我希望我提供了足够的信息


查尔斯

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

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
DECLARE@state nvarchar(50),
@长度int,
@上次激活时间日期时间
创建表#mailstatusetable
(
[队列类型]nvarchar(最大值),
[length]int,
[州]nvarchar(最大值),
[last_empty_rowset_time]日期时间,
[上次激活时间]日期时间
)
插入到#mailstatustentable EXEC msdb.dbo.sysmail_help_queue_sp@queue_type='mail'
从mailstatusetable中选择前1个@state=[state]、@length=[length]、@last_activated_time=[last_activated_time]
DROP TABLE#MailStatuseTestable
如果(@length>0)
开始
如果(@state'接收到发生的\u')
开始
如果(DATEDIFF(minute,@last_activated_time,GETDATE())>5)--确保自上次活动以来已过去5分钟(您的超时可能不同)
开始
EXEC msdb.dbo.sysmail\u stop\u sp
EXEC msdb.dbo.sysmail\u start\u sp
结束
结束
结束
我希望这对你有所帮助。如果是,请记住将此标记为答案

亲切问候,, 威廉