Introduction:
Subscribers can define which messages they want to receive from a topic. These messages are specified in the form of one or more named subscription rules. Each rule consists of a filter condition that selects particular messages, and optionally contain an action that annotates the selected message.
All rules without actions are combined using an OR
condition and result in a single message on the subscription even if you have multiple matching rules.
Each rule with an action produces a copy of the message. This message will have a property called RuleName
where the value is the name of the matching rule. The action may add or update properties, or delete properties from the original message to produce a message on the subscription.
Scenario Base:
Consider the following scenario:
- Subscription has five rules.
- Two rules contain actions.
- Three rules don't contain actions.
In this example, if you send one message that matches all five rules, you get three messages on the subscription. That's two messages for two rules with actions and one message for three rules without actions.
Each newly created topic subscription has an initial default subscription rule. If you don't explicitly specify a filter condition for the rule, the applied filter is the true filter that enables all messages to be selected into the subscription. The default rule has no associated annotation action.
Type of Filters in Service Bus:
Service Bus supports three filter conditions:
1) SQL Filters
2) Boolean filters
3) Correlation Filters
1) SQL Filters:-
A SqlFilter holds a SQL-like conditional expression that is evaluated in the broker against the arriving messages' user-defined properties and system properties. All system properties must be prefixed with sys.
in the conditional expression.
As SQL server database- tests for the existence of properties (EXISTS
), null-values (IS NULL
), logical NOT/AND/OR, relational operators, simple numeric arithmetic, and simple text pattern matching with LIKE
Example:
We are using .NET example for defining a SQL filter:
------------------------------------------------------------------------------------------------------
adminClient = new ServiceBusAdministrationClient(connectionString);
// Create a SQL filter with color set to blue and quantity to 10
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, "ColorBlueSize10Orders"),
new CreateRuleOptions("BlueSize10Orders", new SqlRuleFilter("color='blue' AND quantity=10")));
// Create a SQL filter with color set to red
// Action is defined to set the quantity to half if the color is red
await adminClient.CreateRuleAsync(topicName, "ColorRed", new CreateRuleOptions
{
Name = "RedOrdersWithAction",
Filter = new SqlRuleFilter("user.color='red'"),
Action = new SqlRuleAction("SET quantity = quantity / 2;")
}
-----------------------------------------------------------------------------------------------------
2) Boolean filters:-The TrueFilter and FalseFilter either cause all arriving messages (true) or none of the arriving messages (false) to be selected for the subscription. These two filters derive from the SQL filter.
Example: .NET example for defining a boolean filter:
------------------------------------------------------------------------------------------------------
// Create a True Rule filter with an expression that always evaluates to true
// It's equivalent to using SQL rule filter with 1=1 as the expression
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, subscriptionAllOrders),
new CreateRuleOptions("AllOrders", new TrueRuleFilter()));
------------------------------------------------------------------------------------------------------
3) Correlation Filters:-A CorrelationFilter holds a set of conditions that are matched against one or more of an arriving message's user and system properties. A common use is to match against the CorrelationId property, but the application can also choose to match against the following properties:
- ContentType
- Label
- MessageId
- ReplyTo
- ReplyToSessionId
- SessionId
- To
- any user-defined properties.
A match exists when an arriving message's value for a property is equal to the value specified in the correlation filter. For string expressions, the comparison is case-sensitive. If you specify multiple match properties, the filter combines them as a logical AND condition, meaning for the filter to match, all conditions must match.
Example:
------------------------------------------------------------------------------------------------------
// Create a correlation filter with color set to Red and priority set to High
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, "HighPriorityRedOrders"),
new CreateRuleOptions("HighPriorityRedOrdersRule", new CorrelationRuleFilter() {Subject = "red", CorrelationId = "high"} ));
------------------------------------------------------------------------------------------------------
Actions:
With SQL filter conditions, you can define an action that can annotate the message by adding, removing, or replacing properties and their values. The action uses a SQL-like expression that loosely leans on the SQL UPDATE statement syntax.
The action is done on the message after it has been matched and before the message is selected into the subscription. The changes to the message properties are private to the message copied into the subscription.
Example:
------------------------------------------------------------------------------------------------------
adminClient = new ServiceBusAdministrationClient(connectionString);
// Create a SQL filter with color set to red
// Action is defined to set the quantity to half if the color is red
await adminClient.CreateRuleAsync(topicName, "ColorRed", new CreateRuleOptions
{
Name = "RedOrdersWithAction",
Filter = new SqlRuleFilter("user.color='red'"),
Action = new SqlRuleAction("SET quantity = quantity / 2;")
}
------------------------------------------------------------------------------------------------------
For more details: https://learn.microsoft.com/en-us/azure/service-bus-messaging/topic-filters
No comments:
Post a Comment