You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2014/05/28 15:45:27 UTC
[1/2] git commit: [CAMEL-7469] adding some synchronization for BP
container and config admin updates
Repository: camel
Updated Branches:
refs/heads/master 257f7df7d -> c3758e7e6
[CAMEL-7469] adding some synchronization for BP container and config admin updates
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e1442be3
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e1442be3
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e1442be3
Branch: refs/heads/master
Commit: e1442be3004d67f71a17342b6f90f7b7e03183b3
Parents: 26466b5
Author: Grzegorz Grzybek <gr...@gmail.com>
Authored: Wed May 28 14:41:05 2014 +0200
Committer: Grzegorz Grzybek <gr...@gmail.com>
Committed: Wed May 28 14:58:06 2014 +0200
----------------------------------------------------------------------
.../blueprint/CamelBlueprintTestSupport.java | 56 ++++++++++++++++++--
1 file changed, 53 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/e1442be3/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintTestSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintTestSupport.java b/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintTestSupport.java
index 96a5954..fc88f56 100644
--- a/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintTestSupport.java
+++ b/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintTestSupport.java
@@ -22,6 +22,8 @@ import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
import org.apache.camel.CamelContext;
import org.apache.camel.component.properties.PropertiesComponent;
@@ -34,8 +36,12 @@ import org.junit.Before;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.osgi.service.blueprint.container.BlueprintEvent;
+import org.osgi.service.blueprint.container.BlueprintListener;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationEvent;
+import org.osgi.service.cm.ConfigurationListener;
/**
* Base class for OSGi Blueprint unit tests with Camel.
@@ -62,8 +68,8 @@ public abstract class CamelBlueprintTestSupport extends CamelTestSupport {
@SuppressWarnings({"rawtypes", "unchecked"})
protected BundleContext createBundleContext() throws Exception {
- String symbolicName = getClass().getSimpleName();
- BundleContext answer = CamelBlueprintHelper.createBundleContext(symbolicName, getBlueprintDescriptor(),
+ final String symbolicName = getClass().getSimpleName();
+ final BundleContext answer = CamelBlueprintHelper.createBundleContext(symbolicName, getBlueprintDescriptor(),
includeTestBundle(), getBundleFilter(), getBundleVersion(), getBundleDirectives());
// must register override properties early in OSGi containers
@@ -101,14 +107,58 @@ public abstract class CamelBlueprintTestSupport extends CamelTestSupport {
// allow end user to override properties
String pid = useOverridePropertiesWithConfigAdmin(props);
if (pid != null) {
+ // we will update the configuration now. As OSGi is highly asynchronous, we need to make the tests as repeatable as possible
+ // the problem is when blueprint container defines cm:property-placeholder with update-strategy="reload"
+ // updating the configuration leads to (felix framework + aries blueprint):
+ // 1. schedule org.apache.felix.cm.impl.ConfigurationManager.UpdateConfiguration object to run in config admin thread
+ // 2. this thread calls org.apache.felix.cm.impl.ConfigurationImpl#tryBindLocation()
+ // 3. org.osgi.service.cm.ConfigurationEvent#CM_LOCATION_CHANGED is send
+ // 4. org.apache.aries.blueprint.compendium.cm.ManagedObjectManager.ConfigurationWatcher#updated() is invoked
+ // 5. new Thread().start() is called
+ // 6. org.apache.aries.blueprint.compendium.cm.ManagedObject#updated() is called
+ // 7. org.apache.aries.blueprint.compendium.cm.CmPropertyPlaceholder#updated() is called
+ // 8. new Thread().start() is called
+ // 9. org.apache.aries.blueprint.services.ExtendedBlueprintContainer#reload() is called which destroys everything in BP container
+ // 10. finally reload of BP container is scheduled (in yet another thread)
+ //
+ // if we start/use camel context between point 9 and 10 we may get many different errors described in https://issues.apache.org/jira/browse/ARIES-961
+
+ // to synchronize this (main) thread of execution with the asynchronous series of events, we can register the following listener.
+ // this way be sure that we got to point 3
+ final CountDownLatch latch = new CountDownLatch(2);
+ answer.registerService(ConfigurationListener.class, new ConfigurationListener() {
+ @Override
+ public void configurationEvent(ConfigurationEvent event) {
+ if (event.getType() == ConfigurationEvent.CM_LOCATION_CHANGED) {
+ latch.countDown();
+ }
+ // when we update the configuration, BP container will be reloaded as well
+ // hoping that we get the event after *second* restart, let's register the listener
+ answer.registerService(BlueprintListener.class, new BlueprintListener() {
+ @Override
+ public void blueprintEvent(BlueprintEvent event) {
+ if (event.getType() == BlueprintEvent.CREATED && event.getBundle().getSymbolicName().equals(symbolicName)) {
+ latch.countDown();
+ }
+ }
+ }, null);
+ }
+ }, null);
+
ConfigurationAdmin configAdmin = CamelBlueprintHelper.getOsgiService(answer, ConfigurationAdmin.class);
- Configuration config = configAdmin.getConfiguration(pid);
+ // passing null as second argument ties the configuration to correct bundle.
+ // using single-arg method causes:
+ // *ERROR* Cannot use configuration xxx.properties for [org.osgi.service.cm.ManagedService, id=N, bundle=N/jar:file:xyz.jar!/]: No visibility to configuration bound to file:pojosr
+ Configuration config = configAdmin.getConfiguration(pid, null);
if (config == null) {
throw new IllegalArgumentException("Cannot find configuration with pid " + pid + " in OSGi ConfigurationAdmin service.");
}
log.info("Updating ConfigAdmin {} by overriding properties {}", config, props);
config.update(props);
+
+ latch.await(CamelBlueprintHelper.DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
}
+
return answer;
}
[2/2] git commit: Merge branch 'CAMEL-7469' of
https://github.com/grgrzybek/camel
Posted by da...@apache.org.
Merge branch 'CAMEL-7469' of https://github.com/grgrzybek/camel
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c3758e7e
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c3758e7e
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c3758e7e
Branch: refs/heads/master
Commit: c3758e7e6900fe961353cb5d194c5ec135bd59fd
Parents: 257f7df e1442be
Author: Claus Ibsen <da...@apache.org>
Authored: Wed May 28 15:41:58 2014 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Wed May 28 15:41:58 2014 +0200
----------------------------------------------------------------------
.../blueprint/CamelBlueprintTestSupport.java | 56 ++++++++++++++++++--
1 file changed, 53 insertions(+), 3 deletions(-)
----------------------------------------------------------------------