org.infinispan.spring.remote.provider.SpringRemoteCacheManagerFactoryBean Maven / Gradle / Ivy
package org.infinispan.spring.remote.provider;
import java.util.Properties;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.spring.remote.AbstractRemoteCacheManagerFactory;
import org.infinispan.spring.remote.ConfigurationPropertiesOverrides;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
/**
*
* A {@link FactoryBean FactoryBean
} for creating an
* {@link SpringRemoteCacheManager
* SpringRemoteCacheManager
} instance.
*
* Configuration
*
* A SpringRemoteCacheManager
is configured through a {@link Properties
* Properties
} object. For an exhaustive list of valid properties to be used see
* RemoteCacheManager
's {@link RemoteCacheManager
* javadocs}. This FactoryBean
provides means to either
* {@link #setConfigurationProperties(Properties) inject} a user-defined Properties
* instance or to
* {@link #setConfigurationPropertiesFileLocation(org.springframework.core.io.Resource) set} the
* location of a properties file to load those properties from. Note that it is illegal to
* use both mechanisms simultaneously.
*
*
* Alternatively or in combination with
* {@link #setConfigurationPropertiesFileLocation(org.springframework.core.io.Resource) setting} the
* location of a Properties
file to load the configuration from, this
* FactoryBean
provides (typed) setters for all configuration settings. Settings thus
* defined take precedence over those defined in the injected Properties
instance. This
* flexibility enables users to use e.g. a company-wide Properties
file containing
* default settings while simultaneously overriding select settings whenever special requirements
* warrant this.
* Note that it is illegal to use setters in conjunction with
* {@link #setConfigurationProperties(Properties) injecting} a Properties
instance.
*
*
* In addition to creating a SpringRemoteCacheManager
this FactoryBean
* does also control that SpringRemoteCacheManager
's lifecycle by shutting it down when
* the enclosing Spring application context is closed. It is therefore advisable to always
* use this FactoryBean
when creating an SpringRemoteCacheManager
.
*
*
* @author Olaf Bergner
*
* @see RemoteCacheManager
* @see #destroy()
*/
public class SpringRemoteCacheManagerFactoryBean extends AbstractRemoteCacheManagerFactory
implements FactoryBean, InitializingBean, DisposableBean {
private SpringRemoteCacheManager springRemoteCacheManager;
// ------------------------------------------------------------------------
// org.springframework.beans.factory.InitializingBean
// ------------------------------------------------------------------------
/**
* @see InitializingBean#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() throws Exception {
assertCorrectlyConfigured();
this.logger.info("Creating new instance of RemoteCacheManager ...");
final Properties configurationPropertiesToUse = configurationProperties();
org.infinispan.client.hotrod.configuration.ConfigurationBuilder clientBuilder =
new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
clientBuilder.withProperties(configurationPropertiesToUse);
long readTimeout;
if (configurationPropertiesToUse.containsKey(ConfigurationPropertiesOverrides.OPERATION_READ_TIMEOUT))
readTimeout = Long.parseLong(configurationPropertiesToUse.getProperty(ConfigurationPropertiesOverrides.OPERATION_READ_TIMEOUT));
else
readTimeout = 0;
long writeTimeout;
if (configurationPropertiesToUse.containsKey(ConfigurationPropertiesOverrides.OPERATION_WRITE_TIMEOUT))
writeTimeout = Long.parseLong(configurationPropertiesToUse.getProperty(ConfigurationPropertiesOverrides.OPERATION_WRITE_TIMEOUT));
else
writeTimeout = 0;
final RemoteCacheManager nativeRemoteCacheManager = new RemoteCacheManager(
clientBuilder.build(), this.startAutomatically);
this.springRemoteCacheManager = new SpringRemoteCacheManager(nativeRemoteCacheManager, readTimeout, writeTimeout);
this.logger.info("Finished creating new instance of RemoteCacheManager");
}
// ------------------------------------------------------------------------
// org.springframework.beans.factory.FactoryBean
// ------------------------------------------------------------------------
/**
* @see FactoryBean#getObject()
*/
@Override
public SpringRemoteCacheManager getObject() throws Exception {
return this.springRemoteCacheManager;
}
/**
* @see FactoryBean#getObjectType()
*/
@Override
public Class extends SpringRemoteCacheManager> getObjectType() {
return this.springRemoteCacheManager != null ? this.springRemoteCacheManager.getClass()
: SpringRemoteCacheManager.class;
}
/**
* Always return true
.
*
* @see FactoryBean#isSingleton()
*/
@Override
public boolean isSingleton() {
return true;
}
// ------------------------------------------------------------------------
// org.springframework.beans.factory.DisposableBean
// ------------------------------------------------------------------------
/**
* {@link RemoteCacheManager#stop() stop
} the
* RemoteCacheManager
created by this factory.
*
* @see DisposableBean#destroy()
*/
@Override
public void destroy() throws Exception {
// Being paranoid
if (this.springRemoteCacheManager != null) {
this.springRemoteCacheManager.stop();
}
}
}