blob: 59d4c1cd0c2abb13f345dc9d2b10abbde1f16231 [file] [log] [blame]
#pragma once
#ifndef GEODE_GFCPP_CACHEFACTORY_H_
#define GEODE_GFCPP_CACHEFACTORY_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 "gfcpp_globals.hpp"
#include "gf_types.hpp"
#include "DistributedSystem.hpp"
#include "Cache.hpp"
#include "CacheAttributes.hpp"
#include "PoolFactory.hpp"
/**
* @file
*/
#define DEFAULT_POOL_NAME "default_gemfireClientPool"
namespace apache {
namespace geode {
namespace client {
class CppCacheLibrary;
/**
* @class CacheFactory CacheFactory.hpp
* Top level class for configuring and using GemFire on a client.This should be
*called once to create {@link Cache}.
*<p>
* For the default values for the pool attributes see {@link PoolFactory}.
* To create additional {@link Pool}s see {@link PoolManager}
*/
class CPPCACHE_EXPORT CacheFactory : public SharedBase {
public:
/**
* To create the instance of {@link CacheFactory}
* @param dsProps
* Properties which are applicable at client level.
*/
static CacheFactoryPtr createCacheFactory(
const PropertiesPtr& dsProps = NULLPTR);
/**
* To create the instance of {@link Cache}.
*/
CachePtr create();
/**
* Gets the instance of {@link Cache} produced by an
* earlier call to {@link CacheFactory::create}.
* @param system the <code>DistributedSystem</code> the cache was created
* with.
* @return the {@link Cache} associated with the specified system.
* @throws CacheClosedException if a cache has not been created
* or the created one is {@link Cache::isClosed closed}
* @throws EntryNotFoundException if a cache with specified system not found
*/
static CachePtr getInstance(const DistributedSystemPtr& system);
/**
* Gets the instance of {@link Cache} produced by an
* earlier call to {@link CacheFactory::create}, even if it has been closed.
* @param system the <code>DistributedSystem</code> the cache was created
* with.
* @return the {@link Cache} associated with the specified system.
* @throws CacheClosedException if a cache has not been created
* @throws EntryNotFoundException if a cache with specified system is not
* found
*/
static CachePtr getInstanceCloseOk(const DistributedSystemPtr& system);
/**
* Gets an arbitrary open instance of {@link Cache} produced by an
* earlier call to {@link CacheFactory::create}.
* @throws CacheClosedException if a cache has not been created
* or the only created one is {@link Cache::isClosed closed}
*/
static CachePtr getAnyInstance();
/** Returns the version of the cache implementation.
* For the 1.0 release of GemFire, the string returned is <code>1.0</code>.
* @return the version of the cache implementation as a <code>String</code>
*/
static const char* getVersion();
/** Returns the product description string including product name and version.
*/
static const char* getProductDescription();
/**
* Sets the free connection timeout for this pool.
* If the pool has a max connections setting, operations will block
* if all of the connections are in use. The free connection timeout
* specifies how long those operations will block waiting for
* a free connection before receiving
* an {@link AllConnectionsInUseException}. If max connections
* is not set this setting has no effect.
* @see #setMaxConnections(int)
* @param connectionTimeout is the connection timeout in milliseconds
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>connectionTimeout</code>
* is less than or equal to <code>0</code>.
*/
CacheFactoryPtr setFreeConnectionTimeout(int connectionTimeout);
/**
* Sets the load conditioning interval for this pool.
* This interval controls how frequently the pool will check to see if
* a connection to a given server should be moved to a different
* server to improve the load balance.
* <p>A value of <code>-1</code> disables load conditioning
* @param loadConditioningInterval is the connection lifetime in milliseconds
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>connectionLifetime</code>
* is less than <code>-1</code>.
*/
CacheFactoryPtr setLoadConditioningInterval(int loadConditioningInterval);
/**
* Sets the socket buffer size for each connection made in this pool.
* Large messages can be received and sent faster when this buffer is larger.
* Larger buffers also optimize the rate at which servers can send events
* for client subscriptions.
* @param bufferSize is the size of the socket buffers used for reading and
* writing on each connection in this pool.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>bufferSize</code>
* is less than or equal to <code>0</code>.
*/
CacheFactoryPtr setSocketBufferSize(int bufferSize);
/**
* Sets the thread local connections policy for this pool.
* If <code>true</code> then any time a thread goes to use a connection
* from this pool it will check a thread local cache and see if it already
* has a connection in it. If so it will use it. If not it will get one from
* this pool and cache it in the thread local. This gets rid of thread
* contention
* for the connections but increases the number of connections the servers
* see.
* <p>If <code>false</code> then connections are returned to the pool as soon
* as the operation being done with the connection completes. This allows
* connections to be shared amonst multiple threads keeping the number of
* connections down.
* @param threadLocalConnections if <code>true</code> then enable thread local
* connections.
* @return a reference to <code>this</code>
*/
CacheFactoryPtr setThreadLocalConnections(bool threadLocalConnections);
/**
* Sets the number of milliseconds to wait for a response from a server before
* timing out the operation and trying another server (if any are available).
* @param timeout is the number of milliseconds to wait for a response from a
* server
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>timeout</code>
* is less than or equal to <code>0</code>.
*/
CacheFactoryPtr setReadTimeout(int timeout);
/**
* Sets the minimum number of connections to keep available at all times.
* When the pool is created, it will create this many connections.
* If <code>0</code> then connections will not be made until an actual
* operation
* is done that requires client-to-server communication.
* @param minConnections is the initial number of connections
* this pool will create.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>minConnections</code>
* is less than <code>0</code>.
*/
CacheFactoryPtr setMinConnections(int minConnections);
/**
* Sets the max number of client to server connections that the pool will
* create. If all of
* the connections are in use, an operation requiring a client to server
* connection
* will block until a connection is available.
* @see #setFreeConnectionTimeout(int)
* @param maxConnections is the maximum number of connections in the pool.
* <code>-1</code> indicates that there is no maximum number of connections
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>maxConnections</code>
* is less than <code>minConnections</code>.
*/
CacheFactoryPtr setMaxConnections(int maxConnections);
/**
* Sets the amount of time a connection can be idle before expiring the
* connection.
* If the pool size is greater than the minimum specified by
* {@link PoolFactory#setMinConnections(int)}, connections which have been
* idle
* for longer than the idleTimeout will be closed.
* @param idleTimeout is the amount of time in milliseconds that an idle
* connection
* should live before expiring. -1 indicates that connections should never
* expire.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>idleTimout</code>
* is less than <code>0</code>.
*/
CacheFactoryPtr setIdleTimeout(long idleTimeout);
/**
* Set the number of times to retry a request after timeout/exception.
* @param retryAttempts is the number of times to retry a request
* after timeout/exception. -1 indicates that a request should be
* tried against every available server before failing
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>idleTimout</code>
* is less than <code>0</code>.
*/
CacheFactoryPtr setRetryAttempts(int retryAttempts);
/**
* The frequency with which servers must be pinged to verify that they are
* still alive.
* Each server will be sent a ping every <code>pingInterval</code> if there
* has not
* been any other communication with the server.
*
* These pings are used by the server to monitor the health of
* the client. Make sure that the <code>pingInterval</code> is less than the
* maximum time between pings allowed by the bridge server.
* @param pingInterval is the amount of time in milliseconds between
* pings.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>pingInterval</code>
* is less than <code>0</code>.
*/
CacheFactoryPtr setPingInterval(long pingInterval);
/**
* The frequency with which client updates the locator list. To disable this
* set its
* value to 0.
* @param updateLocatorListInterval is the amount of time in milliseconds
* between
* checking locator list at locator.
*/
CacheFactoryPtr setUpdateLocatorListInterval(long updateLocatorListInterval);
/**
* The frequency with which the client statistics must be sent to the server.
* Doing this allows <code>GFMon</code> to monitor clients.
* <p>A value of <code>-1</code> disables the sending of client statistics
* to the server.
*
* @param statisticInterval is the amount of time in milliseconds between
* sends of client statistics to the server.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>statisticInterval</code>
* is less than <code>-1</code>.
*/
CacheFactoryPtr setStatisticInterval(int statisticInterval);
/**
* Configures the group which contains all the servers that this pool connects
* to.
* @param group is the server group that this pool will connect to.
* If the value is <code>null</code> or <code>""</code> then the pool connects
* to all servers.
* @return a reference to <code>this</code>
*/
CacheFactoryPtr setServerGroup(const char* group);
/**
* Adds a locator, given its host and port, to this factory.
* The locator must be a server locator and will be used to discover other
* running
* bridge servers and locators.
* @param host is the host name or ip address that the locator is listening
* on.
* @param port is the port that the locator is listening on.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if the <code>host</code> is an unknown
* host
* according to {@link java.net.InetAddress#getByName} or if the port is
* outside
* the valid range of [1..65535] inclusive.
* @throws IllegalStateException if the locator has already been {@link
* #addServer added} to this factory.
*/
CacheFactoryPtr addLocator(const char* host, int port);
/**
* Adds a server, given its host and port, to this factory.
* The server must be a bridge server and this client will
* directly connect to the server without consulting a server locator.
* @param host is the host name or ip address that the server is listening on.
* @param port is the port that the server is listening on.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if the <code>host</code> is an unknown
* host
* according to {@link java.net.InetAddress#getByName} or if the port is
* outside
* the valid range of [1..65535] inclusive.
* @throws IllegalStateException if the server has already been {@link
* #addLocator added} to this factory.
*/
CacheFactoryPtr addServer(const char* host, int port);
/**
* If set to <code>true</code> then the created pool will have
* server-to-client
* subscriptions enabled.
* If set to <code>false</code> then all <code>Subscription*</code> attributes
* are ignored at the time of creation.
* @return a reference to <code>this</code>
*/
CacheFactoryPtr setSubscriptionEnabled(bool enabled);
/**
* Sets the redundancy level for this pools server-to-client subscriptions.
* If <code>0</code> then no redundant copies are kept on the servers.
* Otherwise an effort is made to maintain the requested number of
* copies of the server-to-client subscriptions. At most, one copy per server
* is
* made up to the requested level.
* @param redundancy is the number of redundant servers for this client's
* subscriptions.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>redundancyLevel</code>
* is less than <code>-1</code>.
*/
CacheFactoryPtr setSubscriptionRedundancy(int redundancy);
/**
* Sets the messageTrackingTimeout attribute which is the time-to-live period,
* in
* milliseconds, for subscription events the client has received from the
* server. It is used
* to minimize duplicate events.
* Entries that have not been modified for this amount of time
* are expired from the list.
* @param messageTrackingTimeout is the number of milliseconds to set the
* timeout to.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>messageTrackingTimeout</code>
* is less than or equal to <code>0</code>.
*/
CacheFactoryPtr setSubscriptionMessageTrackingTimeout(
int messageTrackingTimeout);
/**
* Sets the is the interval in milliseconds
* to wait before sending acknowledgements to the bridge server for
* events received from the server subscriptions.
*
* @param ackInterval is the number of milliseconds to wait before sending
* event
* acknowledgements.
* @return a reference to <code>this</code>
* @throws IllegalArgumentException if <code>ackInterval</code>
* is less than or equal to <code>0</code>.
*/
CacheFactoryPtr setSubscriptionAckInterval(int ackInterval);
/**
* Sets whether Pool is in multi user secure mode.
* If its in multiuser mode then app needs to get RegionService instance of
* Cache, to do the operations on cache.
* Deafult value is false.
* @param multiuserAuthentication
* to set the pool in multiuser mode.
* @return a reference to <code>this</code>
*/
CacheFactoryPtr setMultiuserAuthentication(bool multiuserAuthentication);
/**
* By default setPRSingleHopEnabled is true<br>
* The client is aware of location of partitions on servers hosting
* {@link Region}s.
* Using this information, the client routes the client cache operations
* directly to the server which is hosting the required partition for the
* cache operation.
* If setPRSingleHopEnabled is false the client can do an extra hop on servers
* to go to the required partition for that cache operation.
* The setPRSingleHopEnabled avoids extra hops only for following cache
* operations:<br>
* 1. {@link Region#put(Object, Object)}<br>
* 2. {@link Region#get(Object)}<br>
* 3. {@link Region#destroy(Object)}<br>
* 4. {@link Region#getAll(Object, object)}<br>
* If true, works best when {@link PoolFactory#setMaxConnections(int)} is set
* to -1.
* @param name is boolean whether PR Single Hop optimization is enabled or
* not.
* @return a reference to <code>this</code>
*/
CacheFactoryPtr setPRSingleHopEnabled(bool enabled);
/**
* Control whether pdx ignores fields that were unread during deserialization.
* The default is to preserve unread fields be including their data during
* serialization.
* But if you configure the cache to ignore unread fields then their data will
* be lost
* during serialization.
* <P>You should only set this attribute to <code>true</code> if you know this
* member
* will only be reading cache data. In this use case you do not need to pay the
* cost
* of preserving the unread fields since you will never be reserializing pdx
* data.
*
* @param ignore <code>true</code> if fields not read during pdx
* deserialization should be ignored;
* <code>false</code>, the default, if they should be preserved.
*
*
* @return this CacheFactory
* @since 3.6
*/
CacheFactoryPtr setPdxIgnoreUnreadFields(bool ignore);
/** Sets the object preference to PdxInstance type.
* When a cached object that was serialized as a PDX is read
* from the cache a {@link PdxInstance} will be returned instead of the actual
* domain class.
* The PdxInstance is an interface that provides run time access to
* the fields of a PDX without deserializing the entire PDX.
* The PdxInstance implementation is a light weight wrapper
* that simply refers to the raw bytes of the PDX that are kept
* in the cache. Using this method applications can choose to
* access PdxInstance instead of C++ object.
* <p>Note that a PdxInstance is only returned if a serialized PDX is found in
* the cache.
* If the cache contains a deserialized PDX, then a domain class instance is
* returned instead of a PdxInstance.
*
* @param pdxReadSerialized true to prefer PdxInstance
* @return this ClientCacheFactory
*/
CacheFactoryPtr setPdxReadSerialized(bool pdxReadSerialized);
/**
* Sets a gemfire property that will be used when creating the {link @Cache}.
* @param name the name of the gemfire property
* @param value the value of the gemfire property
* @return a reference to <code>this</code>
* @since 3.5
*/
CacheFactoryPtr set(const char* name, const char* value);
private:
PoolFactoryPtr pf;
PropertiesPtr dsProp;
bool ignorePdxUnreadFields;
bool pdxReadSerialized;
PoolFactoryPtr getPoolFactory();
CachePtr create(const char* name, DistributedSystemPtr system = NULLPTR,
const char* cacheXml = 0,
const CacheAttributesPtr& attrs = NULLPTR);
static void create_(const char* name, DistributedSystemPtr& system,
const char* id_data, CachePtr& cptr,
bool ignorePdxUnreadFields, bool readPdxSerialized);
// no instances allowed
CacheFactory();
CacheFactory(const PropertiesPtr dsProps);
~CacheFactory();
PoolPtr determineDefaultPool(CachePtr cachePtr);
static CachePtr getAnyInstance(bool throwException);
static GfErrType basicGetInstance(const DistributedSystemPtr& system,
bool closeOk, CachePtr& cptr);
// Set very first time some creates cache
static CacheFactoryPtr default_CacheFactory;
static PoolPtr createOrGetDefaultPool();
static void* m_cacheMap;
static void init();
static void cleanup();
static void handleXML(CachePtr& cachePtr, const char* cachexml,
DistributedSystemPtr& system);
friend class CppCacheLibrary;
friend class RegionFactory;
friend class RegionXmlCreation;
friend class CacheXmlCreation;
};
} // namespace client
} // namespace geode
} // namespace apache
#endif // GEODE_GFCPP_CACHEFACTORY_H_