You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by io...@apache.org on 2011/11/20 15:21:58 UTC
svn commit: r1204173 - in /karaf/cellar/trunk/hazelcast/src:
main/java/org/apache/karaf/cellar/hazelcast/factory/
main/resources/OSGI-INF/blueprint/
test/java/org/apache/karaf/cellar/hazelcast/factory/
Author: iocanel
Date: Sun Nov 20 14:21:57 2011
New Revision: 1204173
URL: http://svn.apache.org/viewvc?rev=1204173&view=rev
Log:
[KARAF-1011] Fixed a bug that prevented the cellar instance to be propely initialized after restarts.
Modified:
karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java
karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml
karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java
Modified: karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java?rev=1204173&r1=1204172&r2=1204173&view=diff
==============================================================================
--- karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java (original)
+++ karaf/cellar/trunk/hazelcast/src/main/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactory.java Sun Nov 20 14:21:57 2011
@@ -24,18 +24,22 @@ import org.apache.karaf.cellar.core.disc
import org.apache.karaf.cellar.core.discovery.DiscoveryTask;
import org.apache.karaf.cellar.core.utils.CombinedClassLoader;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
@@ -72,30 +76,25 @@ public class HazelcastServiceFactory {
private DiscoveryTask discoveryTask;
private CombinedClassLoader combinedClassLoader;
+ private ConfigurationAdmin configurationAdmin;
private BundleContext bundleContext;
private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
- private Semaphore semaphore = new Semaphore(1);
+ private HazelcastInstance instance;
- /**
- * Constructor
- */
- public HazelcastServiceFactory() {
- try {
- //Make sure that an the properties will be applied before an instance is created.
- semaphore.acquire();
- } catch (InterruptedException e) {
- LOGGER.error("Failed to acquire initialization semaphore.", e);
- }
- }
public void init() {
- scheduler.scheduleAtFixedRate(discoveryTask, 0, 10, TimeUnit.SECONDS);
+ if (discoveryTask != null) {
+ scheduler.scheduleAtFixedRate(discoveryTask, 0, 10, TimeUnit.SECONDS);
+ } else {
+ LOGGER.warn("Did not found a discovery task");
+ }
if(combinedClassLoader != null) {
combinedClassLoader.addBundle(bundleContext.getBundle());
}
+ createInstance();
}
public void destroy() {
@@ -107,8 +106,7 @@ public class HazelcastServiceFactory {
*
* @param properties
*/
- public void createOrUpdate(Map properties) {
- try {
+ public void update(Map properties) {
Boolean updated = Boolean.FALSE;
//We need it to properly instantiate Hazelcast.
if(combinedClassLoader != null) {
@@ -194,17 +192,32 @@ public class HazelcastServiceFactory {
if (updated) {
updateMemberList();
}
- } finally {
- //Release the semaphore so that an instance can be created.
- // This is necessary becasue the execution order is random.
- if (semaphore.availablePermits() == 0) {
- semaphore.release(1);
+ }
+
+ public void createInstance() {
+ Configuration configuration = null;
+ Map configurationMap = new HashMap();
+ try {
+ configuration = configurationAdmin.getConfiguration("org.apache.karaf.cellar.instance");
+ Dictionary dictionary = configuration.getProperties();
+ if (dictionary != null && !dictionary.isEmpty()) {
+ Enumeration enumeration = dictionary.keys();
+
+ while (enumeration.hasMoreElements()) {
+ String key = (String) enumeration.nextElement();
+ String value = (String) dictionary.get(key);
+ configurationMap.put(key, value);
+ }
}
+ update(configurationMap);
+ } catch (IOException e) {
+ LOGGER.error("Could not read instnace configuration.",e);
}
+
}
public void updateMemberList() {
- HazelcastInstance instance = lookupInstance();
+ HazelcastInstance instance = getInstance();
if (instance != null) {
try {
instance.getConfig().setGroupConfig(buildGroupConfig());
@@ -222,16 +235,9 @@ public class HazelcastServiceFactory {
*
* @return
*/
- public HazelcastInstance lookupInstance() {
- HazelcastInstance instance = null;
- try {
- if (bundleContext != null) {
- ServiceReference reference = bundleContext.getServiceReference("com.hazelcast.core.HazelcastInstance");
- instance = (HazelcastInstance) bundleContext.getService(reference);
- bundleContext.ungetService(reference);
- }
- } catch (Exception ex) {
- LOGGER.warn("No Hazelcast instance found in service registry.");
+ public HazelcastInstance getInstance() {
+ if (instance == null) {
+ this.instance = buildInstance();
}
return instance;
}
@@ -241,15 +247,10 @@ public class HazelcastServiceFactory {
*
* @return
*/
- public HazelcastInstance buildInstance() {
+ private HazelcastInstance buildInstance() {
if(combinedClassLoader != null) {
Thread.currentThread().setContextClassLoader(combinedClassLoader);
}
- try {
- semaphore.acquire();
- } catch (InterruptedException e) {
- LOGGER.error("Failed to acquire instance semaphore", e);
- }
return Hazelcast.newHazelcastInstance(buildConfig());
}
@@ -445,4 +446,12 @@ public class HazelcastServiceFactory {
public void setCombinedClassLoader(CombinedClassLoader combinedClassLoader) {
this.combinedClassLoader = combinedClassLoader;
}
+
+ public ConfigurationAdmin getConfigurationAdmin() {
+ return configurationAdmin;
+ }
+
+ public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) {
+ this.configurationAdmin = configurationAdmin;
+ }
}
Modified: karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml?rev=1204173&r1=1204172&r2=1204173&view=diff
==============================================================================
--- karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml (original)
+++ karaf/cellar/trunk/hazelcast/src/main/resources/OSGI-INF/blueprint/blueprint.xml Sun Nov 20 14:21:57 2011
@@ -20,7 +20,7 @@
<!-- Hazelcast hazelcast -->
<bean id="hazelcast" class="com.hazelcast.core.Hazelcast" factory-ref="instanceFactory"
- factory-method="buildInstance" destroy-method="shutdown"/>
+ factory-method="getInstance" destroy-method="shutdown"/>
<bean id="instanceFactory" class="org.apache.karaf.cellar.hazelcast.factory.HazelcastServiceFactory"
@@ -28,8 +28,9 @@
<property name="discoveryTask" ref="discoveryTask"/>
<property name="combinedClassLoader" ref="combinedClassLoader"/>
<property name="bundleContext" ref="blueprintBundleContext"/>
+ <property name="configurationAdmin" ref="configurationAdmin"/>
<cm:managed-properties persistent-id="org.apache.karaf.cellar.instance" update-strategy="component-managed"
- update-method="createOrUpdate"/>
+ update-method="update"/>
</bean>
<!-- Discovery Task -->
Modified: karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java
URL: http://svn.apache.org/viewvc/karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java?rev=1204173&r1=1204172&r2=1204173&view=diff
==============================================================================
--- karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java (original)
+++ karaf/cellar/trunk/hazelcast/src/test/java/org/apache/karaf/cellar/hazelcast/factory/HazelcastServiceFactoryTest.java Sun Nov 20 14:21:57 2011
@@ -40,9 +40,9 @@ public class HazelcastServiceFactoryTest
HazelcastServiceFactory factory = new HazelcastServiceFactory();
factory.setUsername(GroupConfig.DEFAULT_GROUP_NAME);
factory.setPassword(GroupConfig.DEFAULT_GROUP_PASSWORD);
- factory.createOrUpdate(null);
+ factory.update(null);
HazelcastInstance defaultInstance = Hazelcast.newHazelcastInstance(null);
- HazelcastInstance factoryInstance = factory.buildInstance();
+ HazelcastInstance factoryInstance = factory.getInstance();
Assert.assertEquals(true, factoryInstance.getCluster().getMembers().size() >= 2);
}