Hi, Nice catch, can you open an issue on https://issues.apache.org/jira/browse/FELIX (select the iPOJO component). I will have a look tomorrow.
Thanks and regards, Clement On 3 janv. 2014, at 16:38, [email protected] wrote: > Hi > I have a problem with a ManagedServices and IPOJO. > We have a service that provides externally configured properties. We want to > use the managed service approach to get automatic refreshs of changed > properties. The properties are read from a file > {karaf}/etc/na.default.properties containing ~500 properties and are > injected into the service by @Updated, see code below. > Basically the code works fine, but from time to time the service startup > fails with a ConcurrentModificationException in class ProvidedService. The > exception does not show always, but it is reproducible by starting and > stopping the bundle various times. The code has been stripped down to be > very simple and the problem could still be reproduced. > > IPOJO version is 1.11.0, Karaf version 2.3.3 > > Short stacktrace: > > 2014-01-03 16:17:41,357 | INFO | pool-1-thread-1 | > product-properties-services | ? ? | > 64 - product-properties-services - 0.0.1.SNAPSHOT | [INFO] > com.nextaudience.clustor.product.properties.services.DefaultPropertiesResolverService > : An error occurred when creating an instance of > com.nextaudience.clustor.product.properties.services.DefaultPropertiesResolverService > java.util.ConcurrentModificationException > at > java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1115)[:1.7.0_45] > at java.util.TreeMap$ValueIterator.next(TreeMap.java:1160)[:1.7.0_45] > at > org.apache.felix.ipojo.handlers.providedservice.ProvidedService.getServiceProperties(ProvidedService.java:447)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.handlers.providedservice.ProvidedService.registerService(ProvidedService.java:357)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler.__M_stateChanged(ProvidedServiceHandler.java:484)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler.stateChanged(ProvidedServiceHandler.java)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:536)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:418)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:179)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:319)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:240)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.extender.internal.linker.ManagedType$InstanceSupport$1.call(ManagedType.java:312)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.extender.internal.linker.ManagedType$InstanceSupport$1.call(ManagedType.java:306)[55:org.apache.felix.ipojo:1.11.0] > at > org.apache.felix.ipojo.extender.internal.queue.JobInfoCallable.call(JobInfoCallable.java:114)[55:org.apache.felix.ipojo:1.11.0] > at java.util.concurrent.FutureTask.run(FutureTask.java:262)[:1.7.0_45] > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[:1.7.0_45] > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)[:1.7.0_45] > at java.lang.Thread.run(Thread.java:744)[:1.7.0_45] > 2014-01-03 16:17:41,357 | ERROR | pool-1-thread-1 | > product-properties-services | ? ? | > 64 - product-properties-services - 0.0.1.SNAPSHOT | [ERROR] > com.nextaudience.clustor.product.properties.services.DefaultPropertiesResolverService > : null > > Our service: > > > @Component(managedservice = "na.default.properties", publicFactory = false) > @Instantiate > @Provides > public class DefaultPropertiesResolverService implements > ObservablePropertiesResolver { > > private static final Logger LOG = > LoggerFactory.getLogger(DefaultPropertiesResolverService.class); > > @ServiceController > private boolean ready; > private Dictionary<String, String> properties; > > @Validate > synchronized private void startService() { > LOG.info("startService start..."); > if (getProperties() == null) { > LOG.warn("No properties for " + getClass().getName()); > return; > } > if (getProperties().isEmpty()) { > LOG.warn("Empty properties for " + getClass().getName()); > return; > } > ready = true; > LOG.info(DefaultPropertiesResolverService.class.getName() + > "::Start"); > } > > @Invalidate > synchronized private void stopService() { > ready = false; > LOG.info(DefaultPropertiesResolverService.class.getName() + > "::Stop"); > } > > synchronized public Dictionary<String, String> getProperties() { > return properties; > } > > @Updated > synchronized public void updateLocalProperties(Dictionary<String, > String> cfgProperties) { > LOG.info("DefaultProperties: updateLocalProperties start..."); > properties = cfgProperties; > LOG.info("DefaultProperties: updateLocalProperties end"); > } > } > > Thanks for any help > Klaus > > > > -- > View this message in context: > http://apache-felix.18485.x6.nabble.com/IPOJO-ConcurrentModificationException-in-ProvidedService-tp5006665.html > Sent from the Apache Felix - Dev mailing list archive at Nabble.com.
