[ 
https://issues.apache.org/jira/browse/FELIX-4374?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Clement Escoffier closed FELIX-4374.
------------------------------------


> IPOJO: ConcurrentModificationException in ProvidedService
> ---------------------------------------------------------
>
>                 Key: FELIX-4374
>                 URL: https://issues.apache.org/jira/browse/FELIX-4374
>             Project: Felix
>          Issue Type: Bug
>          Components: iPOJO
>    Affects Versions: ipojo-runtime-1.11.0
>         Environment: Karaf 2.3.3
>            Reporter: Klaus Schröder
>            Assignee: Clement Escoffier
>             Fix For: ipojo-runtime-1.11.1
>
>
> 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: 
> {code}
> 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 
> {code}
> Our service: 
> {code
> @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"); 
>     } 
> } 
> {code



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to