它看起來是可以做到從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中的一些功能,可幫助您管理這些功能隊列。 –