[ 
https://issues.apache.org/jira/browse/FELIX-4260?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16622353#comment-16622353
 ] 

Christoph Läubrich commented on FELIX-4260:
-------------------------------------------

This is hard to tell witout knowing the details of the implementation but you 
can force such an error in the following way:
 * Register a service in the activator
 * in the stop method, start a thread that sleeps for a second and the 
unregisters the service reference
 * start the bundle and then stop it
 * You will get the exception from the framework after the 1 second delay 
because the service was unregistered already

With this in mind, one has to check the places mentioned in the stack traces if 
there is a chance that these are called concurrently in respect to the OSGi 
thread, e.g this can happen if config changes occurs from config admin and so 
on. Another thing to check is, if the SCR service might shares service 
references and they got freede more than once.

Sad enough, there is no way to tell if the service was previously unregistered. 
My aproach would be to have a method for unregister a service reference and has 
some kind of
{code:java}
try {
  sr.unregister()
} catch(IllegalStateException e) {
 LOG.warn("Attempted to unregister ServiceRegistration {} from thread {} but it 
was already unregistered from bundle {] state {}), sr, Thread.currentThread(), 
sr.
getBundle().getSymbolicName(), sr.
getBundle().getState()}{code}
That way the unregistration will proceed and the warning would contain better 
information to debug the problem further (if there is any)

> IllegalStateException: The service has been unregistered
> --------------------------------------------------------
>
>                 Key: FELIX-4260
>                 URL: https://issues.apache.org/jira/browse/FELIX-4260
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>            Reporter: Christoph Läubrich
>            Priority: Blocker
>             Fix For: scr-2.1.10
>
>
> Currently I get this as an framework Error:
> java.lang.IllegalStateException: The service has been unregistered
>       at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:209)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:668)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:644)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.registerComponentService(AbstractComponentManager.java:688)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager$Unsatisfied.activate(AbstractComponentManager.java:1481)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:550)
>       at 
> org.apache.felix.scr.impl.manager.DependencyManager.serviceAdded(DependencyManager.java:333)
>       at 
> org.apache.felix.scr.impl.manager.DependencyManager.serviceChanged(DependencyManager.java:159)
>       at 
> org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:104)
>       at 
> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:861)
>       at 
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>       at 
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
>       at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:819)
>       at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:771)
>       at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:130)
>       at 
> org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:214)
>       at 
> org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:433)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:660)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:644)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.registerComponentService(AbstractComponentManager.java:688)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager$Unsatisfied.activate(AbstractComponentManager.java:1481)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:550)
>       at 
> org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:261)
>       at 
> org.apache.felix.scr.impl.config.ImmediateComponentHolder.enableComponents(ImmediateComponentHolder.java:328)
>       at 
> org.apache.felix.scr.impl.BundleComponentActivator.initialize(BundleComponentActivator.java:158)
>       at 
> org.apache.felix.scr.impl.BundleComponentActivator.<init>(BundleComponentActivator.java:113)
>       at 
> org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:261)
>       at org.apache.felix.scr.impl.Activator.bundleChanged(Activator.java:179)
>       at 
> org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:847)
>       at 
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>       at 
> org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
>       at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1522)
>       at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1458)
>       at 
> org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1453)
>       at 
> org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:391)
>       at 
> org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:389)
>       at 
> org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1130)
>       at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559)
>       at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544)
>       at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457)
>       at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243)
>       at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438)
>       at 
> org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1)
>       at 
> org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
>       at 
> org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
> This currently prevents the starting of one of my components. It seems that 
> there is some kind of concurrency. If the ServiceReference is handled in a 
> concurrent way, the IllegalStateException must be caught because it is 
> possible that the service was already unregistered automatically in the event 
> of an refresh/stop of the bundle.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to