这是我的第一个问题!所以我希望我提供足够的信息:
我们正在尝试利用SQL Mail Service Broker发送大约1000封电子邮件。我们对此比较陌生,但是遇到了这个问题:
一些背景:
我们创建了个人资料,帐户和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,一切都很好。
我执行了这个:
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;”我在这篇文章的顶部看到了很长的超时错误列表。我还发现,当发生所有这些错误时,它会关闭Broker Service(消息中毒,我认为它被称为),因此我需要运行sysmail_stop_sp并开始重新启动它。
感谢您的帮助,我希望我提供了足够的信息。
查尔斯
答案 0 :(得分:0)
我遇到了类似的问题,但遗憾的是从未得到过答案。最后,我所能做的就是监视队列,并在崩溃时重新启动它。我使用以下存储过程来执行此操作。
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
我希望这对你有所帮助。如果是这样,请记住将此标记为答案!
亲切的问候, 威廉