2015-09-08 74 views
-1

我有一个存储过程发送一封电子邮件到20k,我从一个.NET网页向它传递参数来调用它。这需要一些时间来发送,如果页面关闭发送停止。在浏览器关闭后继续执行存储过程

我想将参数传递给过程,让它运行直到完成。

是否最好的方法来创建一个SSIS包并从网页开始呢?如果是这样,我可以将参数传递给包并关闭浏览器吗?

回答

1

我想调用一个SSIS包仍然是同步的。你需要解耦它们并让它们异步运行。

这看起来很适合Windows服务。您的网页可以设置一个标志来驱动服务的控制逻辑。

否则,只需设置一个Sql代理作业,用于轮询数据库的给定时间间隔,并在设置标志时开始发送电子邮件。当然,从网页上设置标志。这将使它们分离。

+0

谢谢你的采访。如果我使用代理作业,我会如何将网页上收集的参数传递给过程?我可以在网页上发布这项工作吗? –

+0

不要将作业连接到网页上。网页应该只在数据库中设置一个标志(布尔字段),表示有电子邮件发送,下一次作业运行时应检查标志并决定发送电子邮件并重置它。 – Kar

0

通过创建一个具有SSIS执行步骤并使用sp_start_job的SqlAgent作业,可以异步启动存储过程的SSIS作业。 SSIS: Execute Package via Stored Procedure更详细地介绍了此选项。如果你走这条路线,我不会试图将参数直接传递给作业(我知道这样做的唯一方法就是动态创建作业)。相反,我只需将一些值插入到数据库队列表中,并拥有一个处理该队列的包。

您可能还对某些允许在asp.net中运行后台任务的框架感兴趣(如Hangfire)。

Quartz.NET是另一种流行的后台作业框架。

斯科特Hanselman的覆盖几个这些选项在How to Run Background Tasks in asp.net(而且一定要注意在Asp.net后台任务可能会失败的方式,例如由于应用程序池回收)

但是,无论你采取什么办法,您不应该认为作业已成功完成 - 换句话说,您需要维护某种传出的电子邮件队列,以便在发生故障时重试。

相关问题