You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by in...@apache.org on 2008/12/03 17:29:31 UTC
svn commit: r722959 - in /synapse/trunk/java/modules:
core/src/main/java/org/apache/synapse/config/
utils/src/main/java/org/apache/synapse/commons/util/
utils/src/main/java/org/apache/synapse/commons/util/datasource/
utils/src/main/java/org/apache/syna...
Author: indika
Date: Wed Dec 3 08:29:31 2008
New Revision: 722959
URL: http://svn.apache.org/viewvc?rev=722959&view=rev
Log:
Improve JNDI based DataSource registration
Add RMIRegistry controler to make multiple RMIRegistry if need or shared a single regsitry by many datasources
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java
synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java
synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java
synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java
synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java
synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java
synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java
Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/SynapseConfiguration.java Wed Dec 3 08:29:31 2008
@@ -811,7 +811,7 @@
// clear session information used for SA load balancing
try {
- RMIRegistryController.getInstance().removeLocalRegistry();
+ RMIRegistryController.getInstance().shutDown();
SALSessions.getInstance().reset();
InMemoryDataSourceRepository.getInstance().clear();
JNDIBasedDataSourceRepository registry = JNDIBasedDataSourceRepository.getInstance();
Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/RMIRegistryController.java Wed Dec 3 08:29:31 2008
@@ -11,14 +11,15 @@
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
+import java.util.HashMap;
+import java.util.Map;
public class RMIRegistryController {
public static final Log log = LogFactory.getLog(RMIRegistryController.class);
private static RMIRegistryController ourInstance = new RMIRegistryController();
- private Registry localRegistry;
- private boolean weCreatedRMIReg = false;
+ private final Map<String, Registry> registriesCache = new HashMap<String, Registry>();
public static RMIRegistryController getInstance() {
return ourInstance;
@@ -30,11 +31,28 @@
/**
* Creates a RMI local registry with given port
*
- * @param port The port
+ * @param port The port of the RMI registry to be created
*/
public void createLocalRegistry(int port) {
+
try {
- localRegistry = LocateRegistry.createRegistry(port);
+
+ String key = toKey(port);
+
+ if (registriesCache.containsKey(key)) {
+ if (log.isDebugEnabled()) {
+ log.debug("There is an RMI registry bound to given port :" + port);
+ }
+ return;
+ }
+
+ Registry locateRegistry = LocateRegistry.createRegistry(port);
+ if (locateRegistry == null) {
+ handleException("Unable to create a RMI registry with port : " + port);
+ }
+
+ registriesCache.put(key, locateRegistry);
+
} catch (RemoteException e) {
String msg = "Couldn't create a local registry(RMI) : port " + port +
" already in use.";
@@ -44,19 +62,65 @@
/**
* removes if there is a RMI local registry instance
+ *
+ * @param port The port of the RMI registry to be removed
+ */
+ public void removeLocalRegistry(int port) {
+
+ String key = toKey(port);
+ if (registriesCache.containsKey(key)) {
+ removeRegistry(key, registriesCache.get(key));
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("There is no RMi registry for port : " + port);
+ }
+ }
+
+ }
+
+ /**
+ * Removes all registered RMI registries
*/
- public void removeLocalRegistry() {
- if (localRegistry != null) {
+ public void shutDown() {
+
+ for (String key : registriesCache.keySet()) {
+ removeRegistry(key, registriesCache.get(key));
+ }
+ registriesCache.clear();
+ }
+
+ /**
+ * Helper method to remove a RMI registry instance
+ *
+ * @param key The port of the RMI registry to be removed
+ * @param registry Registry instance
+ */
+ private static void removeRegistry(String key, Registry registry) {
+
+ if (registry != null) {
try {
- log.info("Removing the RMI registy instance from the RMI runtime ");
- UnicastRemoteObject.unexportObject(localRegistry, true);
+ log.info("Removing the RMI registry bound to port : " + key);
+ UnicastRemoteObject.unexportObject(registry, true);
} catch (NoSuchObjectException e) {
String msg = "Error when stopping localregistry(RMI)";
handleException(msg, e);
}
}
+
}
+ private static String toKey(int port) {
+
+ assertPositive(port);
+ return String.valueOf(port);
+ }
+
+ private static void assertPositive(int port) {
+
+ if (port < 0) {
+ handleException("Invalid port number : " + port);
+ }
+ }
/**
* Helper methods for handle errors.
@@ -69,4 +133,14 @@
throw new SynapseUtilException(msg, e);
}
+ /**
+ * Helper methods for handle errors.
+ *
+ * @param msg The error message
+ */
+ private static void handleException(String msg) {
+ log.error(msg);
+ throw new SynapseUtilException(msg);
+ }
+
}
Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceConfigurationConstants.java Wed Dec 3 08:29:31 2008
@@ -81,5 +81,7 @@
public static final String PROP_FACTORY = "factory";
public static final String PROP_NAME = "name";
public static final String DATASOURCE_INFORMATION_REPOSITORY = "DataSourceInformationRepository";
+ public static final String DEFAULT_IC_FACTORY = "com.sun.jndi.rmi.registry.RegistryContextFactory";
+ public static final int DEFAULT_PROVIDER_PORT = 2199;
}
Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/DataSourceInformation.java Wed Dec 3 08:29:31 2008
@@ -314,6 +314,12 @@
this.properties.putAll(properties);
}
+ public void addProperty(String name, String value) {
+ if (name != null && value != null && !"".equals(name) && !"".equals(value)) {
+ this.properties.put(name, value);
+ }
+ }
+
public String getRepositoryType() {
return repositoryType;
}
Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/JNDIBasedDataSourceRepository.java Wed Dec 3 08:29:31 2008
@@ -81,27 +81,41 @@
String dataSourceName = information.getDatasourceName();
validateDSName(dataSourceName);
Properties properties = information.getProperties();
-
+
InitialContext context = null;
Properties jndiEvn = null;
- if (properties != null && !properties.isEmpty()) {
- jndiEvn = createJNDIEnvironment(properties, information.getAlias());
- context = createInitialContext(jndiEvn);
+ if (properties == null || properties.isEmpty()) {
+ if (initialContext != null) {
+ context = initialContext;
+ if (log.isDebugEnabled()) {
+ log.debug("Empty JNDI properties for datasource " + dataSourceName);
+ log.debug("Using system-wide jndi properties : " + jndiProperties);
+ }
+
+ jndiEvn = jndiProperties;
+ }
}
+
if (context == null) {
- validateInitialContext(initialContext);
- context = initialContext;
+ jndiEvn = createJNDIEnvironment(properties, information.getAlias());
+ context = createInitialContext(jndiEvn);
- if (log.isDebugEnabled()) {
- log.debug("Cannot create a name context with jndi properties : " + jndiEvn);
- log.debug("Using system-wide jndi properties : " + jndiProperties);
- }
+ if (context == null) {
- jndiEvn = jndiProperties;
- } else {
- perDataSourceICMap.put(dataSourceName, context);
+ validateInitialContext(initialContext);
+ context = initialContext;
+
+ if (log.isDebugEnabled()) {
+ log.debug("Cannot create a name context with provided jndi properties : " + jndiEvn);
+ log.debug("Using system-wide JNDI properties : " + jndiProperties);
+ }
+
+ jndiEvn = jndiProperties;
+ } else {
+ perDataSourceICMap.put(dataSourceName, context);
+ }
}
String dsType = information.getType();
@@ -376,27 +390,44 @@
private static Properties createJNDIEnvironment(Properties dsProperties, String name) {
- StringBuffer buffer = new StringBuffer();
- buffer.append(DataSourceConfigurationConstants.PROP_SYNAPSE_DATASOURCES);
- buffer.append(DataSourceConfigurationConstants.DOT_STRING);
- if (name != null && !"".equals(name)) {
- buffer.append(name);
- buffer.append(DataSourceConfigurationConstants.DOT_STRING);
- }
- // The prefix for root level jndiProperties
- String rootPrefix = buffer.toString();
+ String namingFactory = DataSourceConfigurationConstants.DEFAULT_IC_FACTORY;
+ String providerUrl = null;
+ int port = DataSourceConfigurationConstants.DEFAULT_PROVIDER_PORT;
+ String providerPort = null;
// setting naming provider
Properties jndiEvn = new Properties(); //This is needed for PerUserPoolDatasource
- String namingFactory = MiscellaneousUtil.getProperty(
- dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_ICFACTORY,
- "com.sun.jndi.rmi.registry.RegistryContextFactory");
+ if (dsProperties != null && !dsProperties.isEmpty()) {
- jndiEvn.put(Context.INITIAL_CONTEXT_FACTORY, namingFactory);
+ if (log.isDebugEnabled()) {
+ log.debug("Using properties " + dsProperties + " to create JNDI Environment");
+ }
- //Provider URL
- String providerUrl = MiscellaneousUtil.getProperty(
- dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL, null);
+ StringBuffer buffer = new StringBuffer();
+ buffer.append(DataSourceConfigurationConstants.PROP_SYNAPSE_DATASOURCES);
+ buffer.append(DataSourceConfigurationConstants.DOT_STRING);
+ if (name != null && !"".equals(name)) {
+ buffer.append(name);
+ buffer.append(DataSourceConfigurationConstants.DOT_STRING);
+ }
+ // The prefix for root level jndiProperties
+ String rootPrefix = buffer.toString();
+
+
+ namingFactory = MiscellaneousUtil.getProperty(
+ dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_ICFACTORY,
+ DataSourceConfigurationConstants.DEFAULT_IC_FACTORY);
+
+ //Provider URL
+ providerUrl = MiscellaneousUtil.getProperty(
+ dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL, null);
+ providerPort =
+ MiscellaneousUtil.getProperty(dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_PORT,
+ String.valueOf(DataSourceConfigurationConstants.DEFAULT_PROVIDER_PORT));
+
+ }
+
+ jndiEvn.put(Context.INITIAL_CONTEXT_FACTORY, namingFactory);
if (providerUrl != null && !"".equals(providerUrl)) {
if (log.isDebugEnabled()) {
@@ -426,21 +457,18 @@
}
// default port for RMI registry
- int port = 2199;
- String providerPort =
- MiscellaneousUtil.getProperty(dsProperties, rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_PORT,
- String.valueOf(port));
- try {
- port = Integer.parseInt(providerPort);
- } catch (NumberFormatException ignored) {
+
+ if (providerPort != null) {
+ try {
+ port = Integer.parseInt(providerPort);
+ } catch (NumberFormatException ignored) {
+ }
}
// Create a RMI local registry
RMIRegistryController.getInstance().createLocalRegistry(port);
+ providerUrl = "rmi://" + providerHost + ":" + port;
- providerUrl = MiscellaneousUtil.getProperty(dsProperties,
- rootPrefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL,
- "rmi://" + providerHost + ":" + providerPort);
}
jndiEvn.put(Context.PROVIDER_URL, providerUrl);
Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/factory/DataSourceInformationFactory.java Wed Dec 3 08:29:31 2008
@@ -235,6 +235,20 @@
if (defaultCatalog != null && !"".equals(defaultCatalog)) {
information.setDefaultCatalog(defaultCatalog);
}
+
+ information.addProperty(prefix + DataSourceConfigurationConstants.PROP_ICFACTORY,
+ MiscellaneousUtil.getProperty(
+ properties, prefix + DataSourceConfigurationConstants.PROP_ICFACTORY,
+ null));
+ //Provider URL
+ information.addProperty(prefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL,
+ MiscellaneousUtil.getProperty(
+ properties, prefix + DataSourceConfigurationConstants.PROP_PROVIDER_URL, null));
+
+ information.addProperty(prefix + DataSourceConfigurationConstants.PROP_PROVIDER_PORT,
+ MiscellaneousUtil.getProperty(
+ properties, prefix + DataSourceConfigurationConstants.PROP_PROVIDER_PORT, null));
+
return information;
}
Modified: synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java?rev=722959&r1=722958&r2=722959&view=diff
==============================================================================
--- synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java (original)
+++ synapse/trunk/java/modules/utils/src/main/java/org/apache/synapse/commons/util/datasource/serializer/DataSourceInformationSerializer.java Wed Dec 3 08:29:31 2008
@@ -41,7 +41,8 @@
// Prefix for getting particular data source's properties
String prefix = buffer.toString();
-
+ addProperty(properties, prefix + DataSourceConfigurationConstants.PROP_DSNAME,
+ information.getDatasourceName());
addProperty(properties, prefix + DataSourceConfigurationConstants.PROP_USER_NAME,
information.getUser());
addProperty(properties, prefix + DataSourceConfigurationConstants.PROP_PASSWORD,