/// <summary> /// Subscribes to receive published messages of the specified type if /// they meet the provided condition. /// </summary> /// <param name="messageType">The type of message to subscribe to.</param> /// <param name="condition">The condition under which to receive the message.</param> public virtual void Subscribe(Type messageType, Predicate <object> condition) { MessagingBestPractices.AssertIsValidForPubSub(messageType); if (Configure.SendOnlyMode) { throw new InvalidOperationException("It's not allowed for a send only endpoint to be a subscriber"); } AssertHasLocalAddress(); var destination = GetAddressForMessageType(messageType); if (Address.Self == destination) { throw new InvalidOperationException(string.Format("Message {0} is owned by the same endpoint that you're trying to subscribe", messageType)); } if (SubscriptionManager == null) { throw new InvalidOperationException("No subscription manager is available"); } SubscriptionManager.Subscribe(messageType, destination); if (SubscriptionPredicatesEvaluator != null) { SubscriptionPredicatesEvaluator.AddConditionForSubscriptionToMessageType(messageType, condition); } }
/// <summary> /// Subscribes to receive published messages of the specified type if /// they meet the provided condition. /// </summary> /// <param name="messageType">The type of message to subscribe to.</param> /// <param name="condition">The condition under which to receive the message.</param> public virtual void Subscribe(Type messageType, Predicate <object> condition) { MessagingBestPractices.AssertIsValidForPubSub(messageType); if (Configure.SendOnlyMode) { throw new InvalidOperationException("It's not allowed for a send only endpoint to be a subscriber"); } AssertHasLocalAddress(); if (SubscriptionManager == null) { throw new InvalidOperationException("No subscription manager is available"); } if (TransportDefinition.HasSupportForCentralizedPubSub && !IsAzureTransport()) { // We are dealing with a brokered transport wired for auto pub/sub. SubscriptionManager.Subscribe(messageType, null); return; } var addresses = GetAddressForMessageType(messageType); if (addresses.Count == 0) { throw new InvalidOperationException(string.Format("No destination could be found for message type {0}. Check the <MessageEndpointMappings> section of the configuration of this endpoint for an entry either for this specific message type or for its assembly.", messageType)); } foreach (var destination in addresses) { if (Address.Self == destination) { throw new InvalidOperationException(string.Format("Message {0} is owned by the same endpoint that you're trying to subscribe", messageType)); } SubscriptionManager.Subscribe(messageType, destination); if (SubscriptionPredicatesEvaluator != null) { SubscriptionPredicatesEvaluator.AddConditionForSubscriptionToMessageType(messageType, condition); } } }