You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Erwin Bronkhorst (JIRA)" <ji...@apache.org> on 2018/05/28 11:37:00 UTC

[jira] [Created] (FELIX-5861) ComponentInstances are disposed before disposal of ComponentFactory

Erwin Bronkhorst created FELIX-5861:
---------------------------------------

             Summary: ComponentInstances are disposed before disposal of ComponentFactory
                 Key: FELIX-5861
                 URL: https://issues.apache.org/jira/browse/FELIX-5861
             Project: Felix
          Issue Type: Bug
          Components: Declarative Services (SCR)
            Reporter: Erwin Bronkhorst


When a bundle that contains a {{ComponentFactory}} is stopped, all {{ComponentInstances}} in the bundle are disposed first, and after that the {{ComponentFactory}} itself [1]. I think it is better if this would be the other way around.

Given a situation in which component X has a static mandatory binding to the {{ComponentFactory}} Y and created {{ComponentInstance}} Z using {{y.newInstance()}}. If the bundle containing Y is stopped, the following order of events happens:
 # All {{ComponentInstances}} created by Y are disposed.
 # Y is going to be disposed, and for that the SCR deactivates component X.
 # The unbind-methods in X are called.
 # The {{ComponentFactory}} Y is deactivated and disposed.

As far as I know, component X get no trigger of event 1. This means that the {{ComponentInstance}} Z can be disposed without component X knowing this. I have seen a situation in which component X tries to use {{ComponentInstance}} Z after event 1, but before event 2 resulting in a runtime exception.
 I think that, because component X created the {{ComponentInstance}} Z, component X is responsible of disposing the instance. It should dispose the created {{ComponentInstances}} when X is deactivated. Of course, to prevent garbage in the registry, it is wise to dispose all remaining {{ComponentInstances}} when the bundle is stopped, in case some components failed to cleanup correctly.

So in short: who is the owner of a {{ComponentInstances}}, created by {{ComponentFactory.newInstance()}} and who is responsible for cleaning it up?
 - If it is the component that called {{newInstance()}}, I think the dispose of the factory should be done before the dispose on the (remaining) {{ComponentInstances}}. This way, the unbind of the factory is called before the {{ComponentInstance}} is disposed.
 - If it is the {{ComponentFactory}} that created the instance, is there a possibility to get a notification when the {{ComponentInstance}} is disposed, so the application can respond to it?

[1] [https://github.com/apache/felix/blob/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java#L350]



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