• Facebook
  • Twitter
  • Youtube
  • LinedIn
  • RSS
  • Docs
  • Comparisons
  • Blogs
  • Download
  • Contact Us
Download
Show / Hide Table of Contents

Using Continuous Query [Deprecated]

Assuming that you have indexed the required searchable attributes, you are now required to implement the Continuous Query in your application. Keeping in mind the purpose of Continuous Queries, the first thing you need to do is to define all the callbacks that need to be executed once the result set of your query is in any way changed. Then, we need to register the Continuous Query with the cache server.

Prerequisites

  • .NET
  • Java
  • Python
  • Legacy API
  • To learn about the standard prerequisites required to work with all NCache client-side features, please refer to the given page on Client-Side API Prerequisites.
  • Indexing for searchable objects and their attributes need to be configured first as explained in Configuring Query Indexes in Administrator's Guide.
  • Cache should have some data related to configured attributes.
  • For API details, refer to: ICache, EventDataFilter, EventType, ExecuteReader, RegisterCQ, UnRegisterCQ, UnRegisterNotification, ContinuousQuery, RegisterNotification, QueryDataNotificationCallback, ICacheReader, FieldCount, Read, Insert, CQEventArg, GetValue.
  • To learn about the standard prerequisites required to work with all NCache client-side features, please refer to the given page on Client-Side API Prerequisites.
  • Indexing for searchable objects and their attributes need to be configured first as explained in Configuring Query Indexes in Administrator's Guide.
  • Cache should have some data related to configured attributes.
  • For API details, refer to: Cache, EventDataFilter, EventType, executeReader, registerCQ, unRegisterCQ, removeDataModificationListener, CacheItem, CacheItemVersion, insert, CQEventArg, getEventType, read, getValue, ContinuousQuery, addDataModificationListener, getFieldCount, CacheReader.
  • To learn about the standard prerequisites required to work with all NCache client-side features, please refer to the given page on Client-Side API Prerequisites.
  • Indexing for searchable objects and their attributes need to be configured first as explained in Configuring Query Indexes in Administrator's Guide.
  • Cache should have some data related to configured attributes.
  • For API details, refer to: get_event_type, execute_reader, register_cq, un_register_cq, remove_data_modification_listener, CacheItem, insert, get_field_count, add_data_modification_listener, ContinuousQuery, read, get_value, EventType, CQEventArg.
  • Install either of the following NuGet packages in your .NET client application:
    • Enterprise: Install-Package Alachisoft.NCache.SDK -Version 4.9.1.0
    • Professional: Install-Package Alachisoft.NCache.Professional.SDK -Version 4.9.1.0
  • Create a new Console Application.
  • Make sure that the data being added is serializable.
  • Add NCache References by locating %NCHOME%\NCache\bin\assembly\4.0 and adding Alachisoft.NCache.Web and Alachisoft.NCache.Runtime as appropriate.
  • Include the Alachisoft.NCache.Runtime.Events and Alachisoft.NCache.Web.Caching namespaces in your application.
  • To learn more about the NCache Legacy API, please download the NCache 4.9 documents available as a .zip file on the Alachisoft Website.

Step 1: Register Query and Notifications

  1. First, you need to create a Continuous Query, which specifies the criteria for the result set for which the events will be fired. This query will be registered against the server.

  2. Once Continuous Query has been created, the pre-defined callbacks are registered with the query. The callbacks are registered according to EventType and EventDataFilter.

  3. The Continuous Query can now be registered on the server using RegisterCQ. You can use this method multiple times in your application to receive notifications for a change in the dataset of your query.

  4. Any modifications in cache event notifications will be triggered according to the event type. For querying cached data, the ExecuteReader executes the query and the result set generated is then read on the client-side, chunk by chunk.

  5. You can trigger events by modifying cache data such that it affects the result set.

The following code sample registers a callback to receive notifications when relevant cache items are added, updated, or removed from the query result. This enables real-time tracking of changes in the matching dataset.

Warning

If the connection breaks between a server and a client, any events fired within this duration will not be received by the client.

  • .NET
  • Java
  • Python
  • Legacy API
// Precondition: Cache is already connected

// Query for required operation
string query = "SELECT $VALUE$ FROM FQN.Product WHERE Category = ?";

// Create query command and add parameters
var queryCommand = new QueryCommand(query);
queryCommand.Parameters.Add("Category", "Beverages");

// Create Continuous Query
var cQuery = new ContinuousQuery(queryCommand);

// Item add, update, remove notification
// EventDataFilter.DataWithMetadata returns the keys with the data and meta added with data
cQuery.RegisterNotification(OnChangeInQueryResultSet, EventType.ItemAdded | EventType.ItemUpdated | EventType.ItemRemoved, EventDataFilter.DataWithMetadata);

// Register continuousQuery on server
cache.MessagingService.RegisterCQ(cQuery);
// Precondition: Cache is already connected

// Query for the desired operation
String query = "SELECT $VALUE$ FROM FQN.Product WHERE Category = ?";

// Create query command
QueryCommand queryCommand = new QueryCommand(query);

// Set parameters
HashMap<String, Object> parameters = queryCommand.getParameters();
parameters.put("Category", "Beverages");

// Create Continuous Query
ContinuousQuery cQuery = new ContinuousQuery(queryCommand);

// Register notifications for continuous query (ItemAdded, ItemUpdated, and ItemRemoved events)
    cQuery.addDataModificationListener(new QueryDataModificationListener() {
        @Override
        public void onQueryDataModified(String key, CQEventArg arg) {
            // Your callback method to handle the notifications
            // For instance, you can call the 'onChangeInQueryResultSet' method from your earlier code here
            onChangeInQueryResultSet(key, arg);
        }
    }, EnumSet.of(EventType.ItemAdded, EventType.ItemUpdated, EventType.ItemRemoved), EventDataFilter.DataWithMetadata);

// Register the continuous query on the server
cache.getMessagingService().registerCQ(cQuery);
System.out.println("Registered Successfully");

# Precondition: Cache is already connected

# Query for required operation
query = "SELECT $Value$ FROM FQN.Product WHERE Category = ?"

# Create query command and add parameters
query_command = ncache.QueryCommand(query)
query_command.set_parameters({"Category": "Beverages"})

# Create continuous query
continuous_query = ncache.ContinuousQuery(query_command)

event_type = [ncache.EventType.ITEM_REMOVED]

# Item  add, update, remove notification
# EventDataFilter.Metadata returns the keys with the data and metadata 
continuous_query.add_data_modification_listener(cq_event_listener, event_type, ncache.EventDataFilter.NONE)

# Register continuous query on server
cache.get_messaging_service().register_cq(continuous_query)
// Using NCache Enterprise 4.9.1
// Precondition: Cache is already connected

// Query for required operation
string queryString = "SELECT $Value$ FROM FQN.Product WHERE this.Category = ?";

// Create query parameters using Hashtable
Hashtable values = new Hashtable();
values.Add("Category", "Beverages");

// Create Continuous Query with query string and parameters
ContinuousQuery cQuery = new ContinuousQuery(queryString, values);

// Register notifications for query events for add, update, and remove operation. 
// EventDataFilter.DataWithMetadata returns keys with data and metadata
cQuery.RegisterNotification(new QueryDataNotificationCallback(OnChangeInQueryResultSet),
    EventType.ItemAdded | EventType.ItemUpdated | EventType.ItemRemoved,
    EventDataFilter.DataWithMetadata);

// Register Continuous Query on server
cache.RegisterCQ(cQuery);

Step 2: Register Callback for Events

Assuming that you have indexed the required searchable attributes, you can implement the Continuous Query in your application. This requires you to define all the callbacks that need to be executed once the result set of your query is modified. A callback can be registered for multiple events as shown below:

  • .NET
  • Java
  • Python
  • Legacy API
public void OnChangeInQueryResultSet(string key, CQEventArg arg)
{
    switch (arg.EventType)
    {
        case EventType.ItemAdded:
             // Perform operations when item is added
            Console.WriteLine($"Item with key '{key}' has been added to result set of continuous query");
            break;

        case EventType.ItemUpdated:
             // Perform operations when item is updated
            Console.WriteLine($"Item with key '{key}' has been updated in the result set of continuous query");

            // Get updated Product object
            // Item can be used if EventDataFilter is DataWithMetadata or Metadata
            if (arg.Item != null)
            {
                Product updatedProduct = arg.Item.GetValue<Product>();
                Console.WriteLine($"Updated product '{updatedProduct.ProductName}' with key '{key}' has ID '{updatedProduct.ProductID}'");
            }
            break;

        case EventType.ItemRemoved:
             // Perform operations when item is removed
            Console.WriteLine($"Item with key '{key}' has been removed from result set of continuous query");
            break;
    }
}
public static void onChangeInQueryResultSet(String key, CQEventArg arg) {
    switch (arg.getEventType()) {
        case ItemAdded:
        // Perform operations when item is added
            System.out.println("Item with key '" + key + "' has been added to result set of continuous query");
            break;

        case ItemUpdated:
             // Perform operations when item is updated
            System.out.println("Item with key '" + key + "' has been updated in the result set of continuous query");
            // Get updated Product object
            // Item can be used if EventDataFilter is DataWithMetadata or Metadata
            if (arg.getItem() != null) {
                Product updatedProduct = (Product) arg.getItem().getValue(Product.class);
                System.out.println("Updated product '" + updatedProduct.getProductName() + "' with key '" + key + "' has ID '" + updatedProduct.getProductID() + "'");
            }
            break;

        case ItemRemoved:
             // Perform operations when item is removed
            System.out.println("Item with key '" + key + "' has been removed from result set of the continuous query");
            break;
        }
    }
def on_change_in_query_resultset(key: str, arg: ncache.CQEventArg):

    if arg.get_event_type() is ncache.EventType.ITEM_ADDED:
        # Perform operations when item is added
        print(f "Item with key" '{key}' "has been added to result set of continuous query")
    if arg.get_event_type() is ncache.EventType.ITEM_UPDATED:
        # Perform operations when item is updated
        print(f "Item with key" '{key}' "has been updated in result set of continuous query")
        if arg.get_item() is not None:
            updated_product = arg.get_item().get_value(Product)
            # Perform operations accordingly
    if arg.get_event_type() is ncache.EventType.ITEM_REMOVED:
        # Perform operations when item is removed
        print(f "Item with key" '{key}' "has been removed from result set of continuous query")
// Using NCache Enterprise 4.9.1

static void OnChangeInQueryResultSet(string key, CQEventArg arg)
{
    switch (arg.EventType)
    {
        case EventType.ItemAdded:
            // Perform operations when item is added
            Console.WriteLine($"Item with key '{key}' has been added to result set of continuous query");

            if (arg.Item != null)
            {
              // Perform the appropriate operation
            }
            break;

        case EventType.ItemUpdated:
            // Perform operations when item is updated
            Console.WriteLine($"Item with key '{key}' has been updated in the result set of continuous query");

            if (arg.Item != null)
            {
                // Perform the appropriate operation
            }

            break;

        case EventType.ItemRemoved:
            // Perform operations when item is removed
            Console.WriteLine($"Item with key '{key}' has been removed from result set of continuous query");
            break;
    }
}
Note

To ensure the operation is fail-safe, it is recommended to handle any potential exceptions within your application, as explained in Handling Failures.

Step 3: Unregister Notifications

Notifications can be unregistered when they are no longer required in the application. You can unregister notifications for a specific event type if multiple event types have been registered using the UnRegisterNotification method. For example, if ItemAdded and ItemRemoved event types were registered but your business logic no longer requires events for ItemAdded, you can specifically unregister notifications for ItemAdded events, while still keeping the add and remove notifications registered.

When a client unregisters a notification from a Continuous Query, it only impacts that specific client. Other clients with the same notifications remain unaffected, allowing independent management of subscriptions. However, this method cannot unregister all CQ notifications through this method. For that, a separate method UnRegisterCQ is used. In the following example, an event notification for an item added notification is unregistered from a Continuous Query.

  • .NET
  • Java
  • Python
  • Legacy API
// Precondition: Cache is already connected

// Unregister notifications for ItemAdded events from continuous query
cQuery.UnRegisterNotification((OnChangeInQueryResultSet), EventType.ItemAdded);
// Precondition: Cache is already connected

// Unregister notifications for ItemAdded events from continuous query

cQuery.removeDataModificationListener(new QueryDataModificationListener() {
@Override
public void onQueryDataModified(String key, CQEventArg arg) {
    // Your callback method to handle the notifications
    // For instance, you can call the 'onChangeInQueryResultSet' method from your earlier code here
    onChangeInQueryResultSet(key, arg);
}
}, EnumSet.of(EventType.ItemAdded, EventType.ItemUpdated, EventType.ItemRemoved));
# Precondition: Cache is already connected

# Unregister notifications for ItemAdded events from continuous query
event_type = [ncache.EventType.ITEM_ADDED]
c_query.remove_data_modification_listener(cq_event_listener, event_type)
// Precondition: Cache is already connected

// Unregister notifications for ItemAdded events from continuous query
cQuery.UnRegisterNotification((OnChangeInQueryResultSet), EventType.ItemAdded);

Step 4: Unregister Continuous Query from Server

Once the application is no longer interested in receiving notifications for changes in a query result set, the registered Continuous Query can be unregistered from the server using the UnRegisterCQ method. Using this method, the result set isn’t immediately removed from the server. If it is the last client, the result set will be removed from the cache. Otherwise, the result set remains in the cache, but that specific client will stop receiving notifications for it. Essentially, it depends on the number of clients registered for that result set.

The UnregisterCQ method takes a ContinuousQuery object as an argument to unregister the callbacks that are no longer fired after this call. The following code example demonstrates how to unregister a Continuous Query from the cache server.

  • .NET
  • Java
  • Python
  • Legacy API
// Precondition: Cache is already connected

// Unregister Continuous Query from server
cache.MessagingService.UnRegisterCQ(cQuery);
// Precondition: Cache is already connected

// Unregister Continuous Query from server
cache.getMessagingService().unRegisterCQ(cQuery);
# Precondition: Cache is already connected

# Unregister Continuous Query from server
cache.get_messaging_service().un_register_cq(c_query)
// Precondition: Cache is already connected

// Unregister Continuous Query from server
cache.UnRegisterCQ(cQuery);

Additional Resources

NCache provides a sample application for Continuous Queries on GitHub.

See Also

.NET: Alachisoft.NCache.Runtime.Events namespace.
Java: com.alachisoft.ncache.events namespace.
Python: ncache.runtime.caching.events class.
Node.js: ContinuousQuery class.

Contact Us

PHONE

+1 (214) 764-6933   (US)

+44 20 7993 8327   (UK)

 
EMAIL

sales@alachisoft.com

support@alachisoft.com

NCache
  • NCache Enterprise
  • NCache Community
  • Edition Comparison
  • NCache Architecture
  • Benchmarks
Download
Pricing
Try Playground

Deployments
  • Cloud (SaaS & Software)
  • On-Premises
  • Kubernetes
  • Docker
Technical Use Cases
  • ASP.NET Sessions
  • ASP.NET Core Sessions
  • Pub/Sub Messaging
  • Real-Time ASP.NET SignalR
  • Internet of Things (IoT)
  • NoSQL Database
  • Stream Processing
  • Microservices
Resources
  • Magazine Articles
  • Third-Party Articles
  • Articles
  • Videos
  • Whitepapers
  • Shows
  • Talks
  • Blogs
  • Docs
Customer Case Studies
  • Testimonials
  • Customers
Support
  • Schedule a Demo
  • Forum (Google Groups)
  • Tips
Company
  • Leadership
  • Partners
  • News
  • Events
  • Careers
Contact Us

  • EnglishChinese (Simplified)FrenchGermanItalianJapaneseKoreanPortugueseSpanish

  • Contact Us
  •  
  • Sitemap
  •  
  • Terms of Use
  •  
  • Privacy Policy
© Copyright Alachisoft 2002 - . All rights reserved. NCache is a registered trademark of Diyatech Corp.
Back to top