它看起来是可以做到从SSIS一个HTTP请求,看到How to make an HTTP request from SSIS?
考虑到这一点,你可以使用通过网关发送消息到NServiceBus(网关只是一个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
}
}
希望这有助于!
nservicebus什么都不知道,有什么能阻止你的SSIS包在完成时调用方法/将消息放入队列吗? – billinkc
不是我所知道的,我只是问最简单的方法是什么。最糟糕的情况是,您可以手动在SSIS中编写代码(或者SQL Server中的CLR中的一些托管代码),以便将消息放入MSMQ队列中 - 但是,然后,您失去了NServiceBus中的一些功能,可帮助您管理这些功能队列。 –