You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2020/07/15 10:05:18 UTC
[sling-org-apache-sling-commons-fsclassloader] branch master updated: SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race… (#2)
This is an automated email from the ASF dual-hosted git repository.
pauls pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-fsclassloader.git
The following commit(s) were added to refs/heads/master by this push:
new cdd3455 SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race… (#2)
cdd3455 is described below
commit cdd3455e5ae6af95ecadf907728e131afde6acc7
Author: Karl Pauls <pa...@apache.org>
AuthorDate: Wed Jul 15 12:05:09 2020 +0200
SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race… (#2)
* SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race condition
* SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race condition
---
.../fsclassloader/impl/FSClassLoaderMBeanImpl.java | 35 ++++++++++++++++++----
.../fsclassloader/impl/FSClassLoaderProvider.java | 31 +------------------
2 files changed, 30 insertions(+), 36 deletions(-)
diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java
index 2db387d..2f56e75 100644
--- a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java
+++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java
@@ -29,21 +29,44 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import org.apache.sling.commons.classloader.ClassLoaderWriter;
import org.apache.sling.commons.fsclassloader.FSClassLoaderMBean;
+import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation of the FSClassLoaderMBean interface
*/
+@Component(
+ configurationPid = FSClassLoaderProvider.SHARED_CONFIGURATION_PID,
+ property = {
+ Constants.SERVICE_DESCRIPTION + "=Apache Sling FSClassLoader Controller Service",
+ Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
+ "jmx.objectname=org.apache.sling.classloader:name=FSClassLoader,type=ClassLoader"
+ }
+)
public class FSClassLoaderMBeanImpl implements FSClassLoaderMBean {
- private final File root;
- private final FSClassLoaderProvider fsClassLoaderProvider;
+ private volatile File root;
private static final Logger log = LoggerFactory.getLogger(FSClassLoaderMBeanImpl.class);
- public FSClassLoaderMBeanImpl(final FSClassLoaderProvider fsClassLoaderProvider, final File root) {
- this.fsClassLoaderProvider = fsClassLoaderProvider;
- this.root = root;
+ @Reference(target = "(component.name=org.apache.sling.commons.fsclassloader.impl.FSClassLoaderProvider)")
+ private ClassLoaderWriter classLoaderWriter;
+
+ /**
+ * Activate this component. Create the root directory.
+ *
+ * @param componentContext
+ * the component context
+ */
+ @Activate
+ protected void activate(final ComponentContext componentContext, final FSClassLoaderComponentConfig config) {
+ // get the file root
+ this.root = CacheLocationUtils.getRootDir(componentContext.getBundleContext(), config);
}
/*
@@ -93,7 +116,7 @@ public class FSClassLoaderMBeanImpl implements FSClassLoaderMBean {
*/
@Override
public void clearCache() {
- fsClassLoaderProvider.delete("");
+ classLoaderWriter.delete("");
}
/*
diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java
index 83e2270..50da643 100644
--- a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java
+++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java
@@ -29,24 +29,18 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Hashtable;
import java.util.List;
import java.util.Map;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-
import org.apache.sling.commons.classloader.ClassLoaderWriter;
import org.apache.sling.commons.classloader.ClassLoaderWriterListener;
import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
-import org.apache.sling.commons.fsclassloader.FSClassLoaderMBean;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
@@ -96,19 +90,16 @@ public class FSClassLoaderProvider implements ClassLoaderWriter {
/** The bundle asking for this service instance */
private Bundle callerBundle;
- private static ServiceRegistration<?> mbeanRegistration;
-
/**
* Activate this component. Create the root directory.
*
* @param componentContext
* @throws MalformedURLException
* @throws InvalidSyntaxException
- * @throws MalformedObjectNameException
*/
@Activate
protected void activate(final ComponentContext componentContext, final FSClassLoaderComponentConfig config)
- throws MalformedURLException, InvalidSyntaxException, MalformedObjectNameException {
+ throws MalformedURLException, InvalidSyntaxException {
// get the file root
this.root = CacheLocationUtils.getRootDir(componentContext.getBundleContext(), config);
this.root.mkdirs();
@@ -137,22 +128,6 @@ public class FSClassLoaderProvider implements ClassLoaderWriter {
}
};
componentContext.getBundleContext().addServiceListener(classLoaderWriterServiceListener, LISTENER_FILTER);
-
- // handle the MBean Installation
- if (mbeanRegistration != null) {
- mbeanRegistration.unregister();
- mbeanRegistration = null;
- }
- Hashtable<String, String> jmxProps = new Hashtable<String, String>();
- jmxProps.put("type", "ClassLoader");
- jmxProps.put("name", "FSClassLoader");
-
- final Hashtable<String, Object> mbeanProps = new Hashtable<String, Object>();
- mbeanProps.put(Constants.SERVICE_DESCRIPTION, "Apache Sling FSClassLoader Controller Service");
- mbeanProps.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
- mbeanProps.put("jmx.objectname", new ObjectName("org.apache.sling.classloader", jmxProps));
- mbeanRegistration = componentContext.getBundleContext().registerService(FSClassLoaderMBean.class.getName(),
- new FSClassLoaderMBeanImpl(this, this.root), mbeanProps);
}
/**
@@ -166,10 +141,6 @@ public class FSClassLoaderProvider implements ClassLoaderWriter {
if (classLoaderWriterServiceListener != null) {
componentContext.getBundleContext().removeServiceListener(classLoaderWriterServiceListener);
}
- if (mbeanRegistration != null) {
- mbeanRegistration.unregister();
- mbeanRegistration = null;
- }
}
private void destroyClassLoader() {