You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2008/09/08 16:49:35 UTC
svn commit: r693114 -
/servicemix/smx4/kernel/trunk/filemonitor/src/main/java/org/apache/servicemix/kernel/filemonitor/FileMonitor.java
Author: gnodet
Date: Mon Sep 8 07:49:33 2008
New Revision: 693114
URL: http://svn.apache.org/viewvc?rev=693114&view=rev
Log:
SMX4KNL-77: The deployer should keep a list of installed bundles that failed to start and retry those when new bundles have been resolved
Modified:
servicemix/smx4/kernel/trunk/filemonitor/src/main/java/org/apache/servicemix/kernel/filemonitor/FileMonitor.java
Modified: servicemix/smx4/kernel/trunk/filemonitor/src/main/java/org/apache/servicemix/kernel/filemonitor/FileMonitor.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/filemonitor/src/main/java/org/apache/servicemix/kernel/filemonitor/FileMonitor.java?rev=693114&r1=693113&r2=693114&view=diff
==============================================================================
--- servicemix/smx4/kernel/trunk/filemonitor/src/main/java/org/apache/servicemix/kernel/filemonitor/FileMonitor.java (original)
+++ servicemix/smx4/kernel/trunk/filemonitor/src/main/java/org/apache/servicemix/kernel/filemonitor/FileMonitor.java Mon Sep 8 07:49:33 2008
@@ -53,6 +53,8 @@
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.BundleEvent;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.packageadmin.PackageAdmin;
@@ -86,8 +88,10 @@
private List<Bundle> bundlesToStart = new ArrayList<Bundle>();
private List<Bundle> bundlesToUpdate = new ArrayList<Bundle>();
private Map<String, String> artifactToBundle = new HashMap<String, String>();
- private Set<String> pendingArtifacts = new HashSet<String>();
- private ServiceListener listener;
+ private final Set<String> pendingTransformationArtifacts = new HashSet<String>();
+ private final Set<Bundle> pendingStartBundles = new HashSet<Bundle>();
+ private ServiceListener deployerListener;
+ private BundleListener bundleListener;
private Executor executor;
public FileMonitor() {
@@ -262,7 +266,7 @@
File f = transformArtifact(file);
if (f == null) {
LOGGER.warn("Unsupported deployment: " + name);
- reschedule(file);
+ rescheduleTransformation(file);
continue;
}
file = f;
@@ -293,35 +297,34 @@
refreshPackagesAndStartOrUpdateBundles();
}
- private void reschedule(File file) {
- synchronized (pendingArtifacts) {
- pendingArtifacts.add(file.getAbsolutePath());
+ private void rescheduleTransformation(File file) {
+ synchronized (pendingTransformationArtifacts) {
+ pendingTransformationArtifacts.add(file.getAbsolutePath());
}
- if (listener == null) {
+ if (deployerListener == null) {
try {
String filter = "(" + Constants.OBJECTCLASS + "=" + DeploymentListener.class.getName() + ")";
- listener = new ServiceListener() {
+ deployerListener = new ServiceListener() {
public void serviceChanged(ServiceEvent event) {
executor.execute(new Runnable() {
public void run() {
Set<String> files;
- synchronized (pendingArtifacts) {
- files = new HashSet<String>(pendingArtifacts);
- pendingArtifacts.clear();
+ synchronized (pendingTransformationArtifacts) {
+ files = new HashSet<String>(pendingTransformationArtifacts);
+ pendingTransformationArtifacts.clear();
}
onFilesChanged(files);
}
});
}
};
- getContext().addServiceListener(listener, filter);
+ getContext().addServiceListener(deployerListener, filter);
} catch (InvalidSyntaxException e) {
// Ignore
}
}
}
-
private File transformArtifact(File file) throws Exception {
// Check registered deployers
ServiceReference[] srvRefs = getContext().getAllServiceReferences(DeploymentListener.class.getName(), null);
@@ -401,8 +404,7 @@
protected Bundle getBundleForJarFile(File file) throws IOException {
String absoluteFilePath = file.getAbsoluteFile().toURI().toString();
Bundle bundles[] = getContext().getBundles();
- for (int i = 0; i < bundles.length; i++) {
- Bundle bundle = bundles[i];
+ for (Bundle bundle : bundles) {
String location = bundle.getLocation();
if (filePathsMatch(absoluteFilePath, location)) {
return bundle;
@@ -550,6 +552,7 @@
}
catch (BundleException e) {
LOGGER.warn("Failed to start bundle: " + bundle + ". Reason: " + e, e);
+ rescheduleStart(bundle);
}
}
@@ -559,6 +562,52 @@
}
}
+ private void rescheduleStart(Bundle bundle) {
+ synchronized (pendingStartBundles) {
+ pendingStartBundles.add(bundle);
+ if (bundleListener == null) {
+ bundleListener = new BundleListener() {
+ public void bundleChanged(BundleEvent event) {
+ if (event.getType() == BundleEvent.RESOLVED) {
+ executor.execute(new Runnable() {
+ public void run() {
+ retryPendingStartBundles();
+ }
+ });
+ }
+ }
+ };
+ getContext().addBundleListener(bundleListener);
+ }
+ }
+ }
+
+ protected void retryPendingStartBundles() {
+ synchronized (pendingStartBundles) {
+ Set<Bundle> bundles = new HashSet<Bundle>();
+ bundles.addAll(pendingStartBundles);
+ pendingStartBundles.clear();
+ boolean success = false;
+ for (Bundle bundle : bundles) {
+ try {
+ bundle.start();
+ LOGGER.info("Pending bundle started: " + bundle);
+ success = true;
+ }
+ catch (BundleException e) {
+ LOGGER.info("Pending bundle not started: " + bundle);
+ pendingStartBundles.add(bundle);
+ }
+ }
+ if (success) {
+ PackageAdmin packageAdmin = getPackageAdmin();
+ if (packageAdmin != null) {
+ packageAdmin.refreshPackages(null);
+ }
+ }
+ }
+ }
+
protected File createBundleJar(File dir) throws BundleException, IOException {
Jar jar = new Jar();
jar.setProject(project);