SQL Server 2012(或SSIS)如何在完成任务后通知NServiceBus?

时间:2013-08-22 13:37:34

标签: ssis sql-server-2012 nservicebus

我们有一些非常长的运行ETL包(有些运行了几个小时)需要由NServiceBus端点启动。我们不需要为整个过程保持单个事务处于活动状态,并且可以将其分解为较小的事务。由于NServiceBus处理程序将自己包装在整个事务中,因此我们不希望在单个事务中处理它,因为它会超时 - 更不用说在DBMS中创建锁定问题了。

我目前的想法是,我们可以异步生成另一个进程,立即从处理程序返回,并在完成时发布一个事件(成功或失败)。我没有找到很多关于如何将新的NServiceBus 4.0 SQL Server Broker支持与传统的MSMQ传输集成的文档。这甚至可能吗?

在SQL Server 2012(或SSIS包)中有一个长时间运行的进程的首选方法是什么,当它以异步方式完成时通知NServiceBus订阅者?

3 个答案:

答案 0 :(得分:5)

看起来可以从SSIS执行http请求,请参阅How to make an HTTP request from SSIS?

考虑到这一点,您可以使用通过网关向网关发送消息(网关只是HttpListener)到您的发布者,告诉它发布消息,通知所有订阅者长时间运行的ETL包已经完成了。

要向网关发送消息,您需要执行以下操作:

var webRequest = (HttpWebRequest)WebRequest.Create("http://localhost:25898/Headquarters/");
webRequest.Method = "POST";
webRequest.ContentType = "text/xml; charset=utf-8";
webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";

webRequest.Headers.Add("Content-Encoding", "utf-8");
webRequest.Headers.Add("NServiceBus.CallType", "Submit");
webRequest.Headers.Add("NServiceBus.AutoAck", "true");
webRequest.Headers.Add("NServiceBus.Id", Guid.NewGuid().ToString("N"));

const string message = "<?xml version=\"1.0\" ?><Messages xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://tempuri.net/NServiceBus.AcceptanceTests.Gateway\"><MyRequest></MyRequest></Messages>";

using (var messagePayload = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(message)))
{
    webRequest.Headers.Add(HttpRequestHeader.ContentMd5, HttpUtility.UrlEncode(Hasher.Hash(messagePayload))); //Need to specify MD5 hash of the payload
    webRequest.ContentLength = messagePayload.Length;

    using (var requestStream = webRequest.GetRequestStream())
    {
        messagePayload.CopyTo(requestStream);
    }
}

using (var myWebResponse = (HttpWebResponse) webRequest.GetResponse())
{
    if (myWebResponse.StatusCode == HttpStatusCode.OK)
    {
        //success
    }
}

希望这有帮助!

答案 1 :(得分:2)

在SSIS 2012中实际上有一项任务是将消息放入MSMQ Message Queue Task。您只需将其指向MSMQ连接,并可以使用表达式来自定义包含名称,成功/失败,行数等的消息。

根据我们谈论的软件包数量以及您希望消息的定制方式,最好的办法是编写一个独立的实用程序来创建您想要的任何格式的消息,然后使用执行流程任务来调用该实用程序包含您要传递的包中的任何参数以格式化为消息。

您也可以使用相同的代码库,只需创建自定义SSIS任务(比听起来要容易得多。)

答案 2 :(得分:1)

有人认为我必须帮助遵守DRY原则,就是使用Master SSIS包。

在我看来,它看起来像是一个与X连接的执行包任务。配置程序包以将程序包名称作为参数。配置执行包任务以使用参数来确定要调用的包。

X可能是一个脚本任务,但也许正如@Kyle Hale指出的那样,它可能是Message Queue Task。我把这个决定留给那些精通NServiceBus的人。

在我看来,重要的是不要将这个逻辑添加到每个包中,因为这将是一个维护噩梦。