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

标签 ssis sql-server-2012 nservicebus

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

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

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

最佳答案

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

考虑到这一点,您可以使用通过网关(网关只是一个 HttpListener)向您的发布者发送消息到 NServiceBus,以告诉它发布一条消息,通知所有订阅者长时间运行的 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
    }
}

希望这可以帮助!

关于ssis - SQL Server 2012(或 SSIS)如何在任务完成后通知 NServiceBus?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18382075/

相关文章:

sql-server - 从 SSIS/DTSX 包中提取 SQL 语句

sql-server - 将 SQL Server 2012 转换为 SQL Azure

azure - NServiceBus MessageForwardingInCaseOfFaultConfig 未按预期工作

nservicebus - 如何使用代码配置 nservicebus msmqtransport

foreach - 每个循环的 "rows in all the tables"是什么?

mysql - 使用SSIS将数据从mysql加载到sql server的快速方法

sql-server - 如何在 SQL Server 抛出中创建串联消息?

sql - 在 SQL Server 2012 中查找列的百分位

c# - WCF 与服务总线

c# - 将 XML 数据集数据表合并为一个数据表