JD *_*toy 4 ssis nservicebus sql-server-2012
我们有一些非常长的运行ETL包(有些运行了几个小时)需要由NServiceBus端点启动.我们不需要为整个过程保持单个事务处于活动状态,并且可以将其分解为较小的事务.由于NServiceBus处理程序将自己包装在整个事务中,因此我们不希望在单个事务中处理它,因为它会超时 - 更不用说在DBMS中创建锁定问题了.
我目前的想法是,我们可以异步生成另一个进程,立即从处理程序返回,并在完成时发布一个事件(成功或失败).我没有找到很多关于如何将新的NServiceBus 4.0 SQL Server Broker支持与传统的MSMQ传输集成的文档.这甚至可能吗?
SQL Server 2012(或SSIS包)中长时间运行的进程在以异步方式完成时通知NServiceBus订阅者的首选方法是什么?
看起来可以从SSIS执行http请求,请参阅如何从SSIS发出HTTP请求?
考虑到这一点,您可以使用通过网关(网关只是一个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
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
归档时间: |
|
查看次数: |
567 次 |
最近记录: |