我想弄清楚從Web-API使用服務總線的最佳做法是什麼。服務總線 - 單身連接類?
我讀過像QueueClient,SubscriptionClient等重新創建對象'是錯誤的方法,所以我需要重用工廠和客戶端。
服務總線客戶對象,如Microsoft.ServiceBus.Messaging.QueueClient或Microsoft.ServiceBus.Messaging.MessageSender,通過一個MessagingFactory對象,它也提供了連接的內部管理創建。發送郵件後,您不應關閉郵件工廠或隊列,主題和訂閱客戶端,然後在發送下一條郵件時重新創建它們。關閉消息傳送工廠會刪除與服務總線服務的連接,並在重新創建工廠時建立新的連接。建立連接是一項昂貴的操作,可以通過爲多個操作重複使用相同的工廠和客戶機對象來避免。
我需要執行一個特殊的類,將堅持服務總線的連接,我在想這會持有特定操作(功能類似EnqueueJobToArchiveQueue(Job job)
和構造將初始化一個單例類這將是由‘具體操作功能’使用QueueClient,和的MessageFactory等」。
我的問題是,我需要關閉的對象(QueueClient.Close()
),什麼時候需要關閉對象?
這裏是我的課至今:
public class ServiceBusHelper
{
private static readonly ServiceBusHelper instance = new ServiceBusHelper();
private static MessagingFactory msgFactory;
private static NamespaceManager namespaceManager;
private const string jobQueueName = "job";
private const string responseTopicName = "jobResult";
private const string archiveQueueName = "jobArchive";
private static QueueClient archiveQueue;
private static QueueClient jobQueue;
private static TopicClient responseTopic;
private ServiceBusHelper()
{
}
static ServiceBusHelper()
{
msgFactory = MessagingFactory.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"]);
namespaceManager = NamespaceManager.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"]);
if (!namespaceManager.QueueExists(jobQueueName))
{
namespaceManager.CreateQueue(jobQueueName);
}
filteringQueue = QueueClient.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"], jobQueueName);
if (!namespaceManager.QueueExists(archiveQueueName))
{
namespaceManager.CreateQueue(archiveQueueName);
}
archiveQueue = QueueClient.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"], archiveQueueName);
if (!namespaceManager.TopicExists(responseTopicName))
{
namespaceManager.TopicExists(responseTopicName);
}
responseTopic = TopicClient.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"],responseTopicName);
}
public static ServiceBusHelper Instance
{
get
{
return instance;
}
}
public void EnququeJobToDo(Job job, string corrId)
{
// Compose the message
BrokeredMessage msg = new BrokeredMessage(job);
msg.CorrelationId = corrId;
// Send the message
filteringQueue.Send(msg);
}
}
正如你看到的,我不關閉連接(QueueClient.Close()
),我應該在哪裏關閉連接?用Dispose()實現一個IDisposable?
如果有更好的方法,我很感激你能否與我分享。
此代碼來自具有體面工作負載的Web-API(Azure Cloud Service)。
更新
我已經更新我的類Dispose()
如下:
public void Dispose()
{
if (msgFactory != null)
{
msgFactory.Close();
}
}
當你說「關閉連接」,它是http連接? – mecek
@mecek「關閉連接」指的是關閉連接對象(QueueClient,MessageFactory等)。 據我所知,有一個基於MessageFactory的TCP連接。 – Ron
您應該儘可能重用連接以獲得更好的性能,關閉每個請求中的連接會損害性能,同時併發請求的數量也在增加。 – mecek