blob: bee097dddd80e50da82939cfa80322d92f810c43 [file] [log] [blame]
#pragma once
#ifndef GEODE_CACHELISTENER_H_
#define GEODE_CACHELISTENER_H_
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <memory>
#include "internal/geode_globals.hpp"
/**
* @file
*/
namespace apache {
namespace geode {
namespace client {
class EntryEvent;
class Region;
class RegionEvent;
/**
* @class CacheListener CacheListener.hpp
* An application plug-in that can be installed on a region.
* Listeners are change notifications that are invoked
* AFTER the change has occured for region update operations on a client.
* Listeners also receive notifications when entries in a region are modified.
* Multiple events can cause concurrent invocation
* of <code>CacheListener</code> methods. If event A occurs before event B,
* there is no guarantee that their corresponding <code>CacheListener</code>
* method invocations will occur in the same order. Any exceptions thrown by
* the listener are caught by Geode and logged. If the exception is due to
* listener invocation on the same thread where a region operation has been
* performed, then a <code>CacheListenerException</code> is thrown back to
* the application. If the exception is for a notification received from
* server then that is logged and the notification thread moves on to
* receiving other notifications.
*
* There are two cases in which listeners are invoked. The first is when a
* region modification operation (e.g. put, create, destroy, invalidate)
* is performed. For this case it is important to ensure that minimal work is
* done in the listener before returning control back to Geode since the
* operation will block till the listener has not completed. For example,
* a listener implementation may choose to hand off the event to a thread pool
* that then processes the event on its thread rather than the listener thread.
* The second is when notifications are received from java server as a result
* of region register interest calls (<code>Region::registerKeys</code> etc),
* or invalidate notifications when notify-by-subscription is false on the
* server. In this case the methods of <code>CacheListener</code> are invoked
* asynchronously (i.e. does not block the thread that receives notification
* messages). Additionally for the latter case of notifications from server,
* listener is always invoked whether or not local operation is successful
* e.g. if a destroy notification is received and key does not exist in the
* region, the listener will still be invoked. This is different from the
* first case where listeners are invoked only when the region update
* operation succeeds.
*
* @see RegionAttributesFactory::setCacheListener
* @see RegionAttributes::getCacheListener
* @see CacheListenerException
*/
class APACHE_GEODE_EXPORT CacheListener {
/**
* @brief public methods
*/
public:
/**
* @brief destructor
*/
virtual ~CacheListener();
/** Handles the event of a new key being added to a region. The entry
* did not previously exist in this region in the local cache (even with a
* nullptr value).
*
* @param event denotes the event object associated with the entry creation
* This function does not throw any exception.
* @see Region::create
* @see Region::put
* @see Region::get
*/
virtual void afterCreate(const EntryEvent& event);
/** Handles the event of an entry's value being modified in a region. This
* entry
* previously existed in this region in the local cache, but its previous
* value
* may have been nullptr.
*
* @param event EntryEvent denotes the event object associated with updating
* the entry
* @see Region::put
*/
virtual void afterUpdate(const EntryEvent& event);
/**
* Handles the event of an entry's value being invalidated.
*
* @param event EntryEvent denotes the event object associated with the entry
* invalidation
*/
virtual void afterInvalidate(const EntryEvent& event);
/**
* Handles the event of an entry being destroyed.
*
* @param event EntryEvent denotes the event object associated with the entry
* destruction
* @see Region::destroy
*/
virtual void afterDestroy(const EntryEvent& event);
/** Handles the event of a region being invalidated. Events are not
* invoked for each individual value that is invalidated as a result of
* the region being invalidated. Each subregion, however, gets its own
* <code>regionInvalidated</code> event invoked on its listener.
* @param event RegionEvent denotes the event object associated with the
* region
* invalidation
* @see Region::invalidateRegion
*/
virtual void afterRegionInvalidate(const RegionEvent& event);
/** Handles the event of a region being destroyed. Events are not invoked for
* each individual entry that is destroyed as a result of the region being
* destroyed. Each subregion, however, gets its own
* <code>afterRegionDestroyed</code> event
* invoked on its listener.
* @param event RegionEvent denotes the event object associated with the
* region
* destruction
* @see Region::destroyRegion
*/
virtual void afterRegionDestroy(const RegionEvent& event);
/** Handles the event of a region being cleared. Events are not invoked for
* each individual entry that is removed as a result of the region being
* cleared. Each subregion, however, gets its own
* <code>afterRegionClear</code> event
* invoked on its listener.
* @param event RegionEvent denotes the event object associated with the
* region
* removal
* @see Region::clear
*/
virtual void afterRegionClear(const RegionEvent& event);
/** Handles the event of a region being live. This event will be invoked
* after processing all the past messages.
* Each subregion, however, gets its own <code>afterRegionLive</code> event
* invoked on its listener.
* @param event RegionEvent denotes the associated event object
*/
virtual void afterRegionLive(const RegionEvent& event);
/** Called when the region containing this callback is destroyed, when
* the cache is closed.
*
* <p>Implementations should clean up any external
* resources, such as database connections. Any runtime exceptions this
* method
* throws will be logged.
*
* <p>It is possible for this method to be called multiple times on a single
* callback instance, so implementations must be tolerant of this.
*
* @see Cache::close
* @see Region::destroyRegion
*/
virtual void close(Region& region);
/**
* Called when all the endpoints assosiated with region are down.
* This will be called when all the endpoints are down for the first time.
* If endpoints come up and again go down it will be called again.
* This will also be called when all endpoints are down and region is attached
* to the pool.
* @param region std::shared_ptr<Region> denotes the assosiated region.
*/
virtual void afterRegionDisconnected(Region& region);
protected:
/**
* @brief constructors
*/
CacheListener();
private:
// never implemented.
CacheListener(const CacheListener& other);
void operator=(const CacheListener& other);
};
} // namespace client
} // namespace geode
} // namespace apache
#endif // GEODE_CACHELISTENER_H_