void CreateQueueIfNecessary(string address, string identity) { if (address == null) { return; } var msmqAddress = MsmqAddress.Parse(address); Logger.Debug($"Creating '{address}' if needed."); MessageQueue queue; if (MsmqUtilities.TryOpenQueue(msmqAddress, out queue) || MsmqUtilities.TryCreateQueue(msmqAddress, identity, settings.UseTransactionalQueues, out queue)) { using (queue) { Logger.Debug("Setting queue permissions."); try { QueuePermissions.SetPermissionsForQueue(queue, identity); } catch (MessageQueueException ex) { Logger.Error($"Unable to set permissions for queue {queue.QueueName}", ex); } } } }
void CreateQueueIfNecessary(string address, string identity) { var msmqAddress = MsmqAddress.Parse(address); Logger.Debug($"Creating '{address}' if needed."); if (msmqAddress.IsRemote) { Logger.Info($"'{address}' is a remote queue and won't be created"); return; } var queuePath = msmqAddress.PathWithoutPrefix; if (MessageQueue.Exists(queuePath)) { Logger.Debug($"'{address}' already exists"); return; } try { using (var queue = MessageQueue.Create(queuePath, useTransactionalQueues)) { try { Logger.Debug("Setting queue permissions."); QueuePermissions.SetPermissionsForQueue(queue, identity); } catch (MessageQueueException ex) { Logger.Error($"Unable to set permissions for queue {queue.QueueName}", ex); } } } catch (MessageQueueException ex) { if (ex.MessageQueueErrorCode == MessageQueueErrorCode.QueueExists) { //Solve the race condition problem when multiple endpoints try to create same queue (e.g. error queue). return; } Logger.Error($"Could not create queue {msmqAddress}. Processing will still continue.", ex); } }