回答

收藏

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

技术问答 技术问答 415 人阅读 | 0 人回复 | 2023-09-12

这是我的第一个问题!因此,我希望我能提供足够的信息:
, I* r# z8 D" K我们正在尝试使用它SQL Mail Service Broker发送大约1000封电子邮件。我们对此并不熟悉,但我们遇到了这个问题:
7 |' e3 }3 c# ~" L; V一些背景:% a: l1 ~$ m4 _/ o
我们创造了一个Profile,一个Account和一个ProfileAccount条目,并启用数据库邮件。然后,我们通过几封电子邮件进行了测试,并且一切正常。然后,我们创造了一个存储过程,我们将从项目中调用该存储过程以使用msdb.dbo.sp_send_dbmail所有电子邮件都排队。这很好用,我们可以msdb.dbo.sysmail_mailitems看到所有成功排队的邮件。Service8 [$ \- v( [, w. z
Broker采取行动,开始处理电子邮件。
' A. Y! t" O" f& W问题:
4 S, b" ^$ a- e/ G发送约90个(绝对不同的数字)后,sql事件日志多次报告错误& ]& M) H9 T( X' h8 f) L  {: l
由于邮件服务器故障,邮件不能发送给收件人。(使用账户42发送电子邮件(2011-09-19T17:20:09)。异常消息:邮件无法发送到邮件服务器。(操作已超时)
0 M: O0 W2 Q* T: M" R$ }, s" T。)。用户42发邮件(2011)-09-19T17:21:59)异常消息:邮件无法发送到邮件服务器。(邮件发送失败。) @  i% c* e3 |( T& }
我参考了该网站以寻求帮助:http : //www.sqlteam.com/article/how-to-troubleshoot-
2 W. D, r! c" ?6 o$ Z) t0 |service-broker-problems
5 v7 I( l7 `( e* I这让我有点困惑,我在Broker运行时运行Query Profiler,一切似乎都很好。
9 A2 n' e; k6 K我做到了:
9 c+ `- e: e* @6 `9 M                从sys.dm_broker_queue_monitors中选择*显示中间状态为NOTIFIED代理队列。这个 NOTIFIED状态似乎表明激活sp但日志没有指出这一点,所以我检查了以下内容,但没有提示:; E% b- p* P: I& U9 I
                从sys.transmission_queue中选择*;    从sys.conversation_endpoints中选择*;    从sys.dm_broker_activated_tasks中选择*;    从sys.dm_broker_connections中选择*;若我操作以下命令:
: z, d8 U+ \6 s+ l8 [5 P& \                EXEC msdb.dbo.sysmail_stop_sp;    EXEC msdb.dbo.sysmail_start_sp;经纪人又开始了,同样的事情发生了。
  H% Z) A5 S0 z- sWindows事件日志似乎显示了最有用的消息,但我不确定如何解决它:8 M# R, Y6 Y6 S& b* n
                事件类型:  事件来源错误atabaseMail    事件类别:无   事件ID:2011年9月19日1年9月19日  时间:5:18:44PM   用户:N / A   电脑: _____    描述:   连接错误。原因:加班已经过期。在从池中获得连接之前,已经过了加班时间。这种情况的原因是所有池化连接都在使用中,达到了池的最大尺寸。  超时时间到了。在从池中获得连接之前,已经超时了。原因是所有池化连接都在使用中,达到了池的最大尺寸。并与之一起运行(如果我运行):从dbo.sysmail_log中选择*;我在这篇文章的顶部看到了一个长长的加时错误列表。我还发现,当所有这些错误发生时,它都会关闭Broker
* w  E7 ^! K- N. S3 HService(我认为这是消息中毒),所以我需要操作sysmail_stop_sp并开始使其再次运行。% x/ T/ u4 R" E$ m8 e5 ?
感谢您的帮助,希望我能提供足够的信息。# f3 j+ X6 O( I) V6 `. [
查尔斯
8 L+ G9 s8 R; q" P; Q: g                                                               
( ]" j/ m# l& n/ o% u    解决方案:                                                               
1 W9 ~: s$ ?) {7 e% ?* |9 g                                                                我也遇到过类似的问题,但不幸的是我没有得到答案。最后,我所能做的就是监视QUEUE,当它崩溃时,重新启动它。我使用以下存储过程来做到这一点。2 e0 N0 t/ y2 S
DECLARE @state nvarchar(50)         @length int,       @last_activated_time datetimeCREATE 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 #MailStatusTempTableDROP TABLE #MailStatusTempTableIF (@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    ENDEND我希望它能帮助你。如果是这样,请记住将其标记为答案!, b  ]; I$ S( [
亲切的问候,威廉
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则