Hi Richard,

This confuses me (and maybe I just don't know enough).

So what you essentially say, is that after Framework.stop(), the system
bundle is essentially in the RESOLVED state just like after an initial
Framework.init() call ? Thus a call to init() after stop() processing
completed has no effect ?

This seems to be kind contradictory to the Framework.stop()
documentation, which includes:

> After being stopped, this Framework may be discarded, initialized or started.

Here is why I am asking: In Sling we do the following for an initial startup :

  * Create Framework instance
  * call Framework.init()
  * install a bunch of bundles
  * check whether one of the bundles is a framework extension bundle
     * if so:
          - call Framework.stop()
          - call Framework.init() (once stop completed)
     * otherwise:
          - continue with next step     
  * start the framework with Framework.start()

The idea of calling stop()-init() is to make sure the system bundle can
have the newly installed system extension fragments attached.

>From your comment I would assume, this to not be possible and I would
have to create a new Framework instance for that ? Would not be a big
deal, but I would need to know ;-)

Regards
Felix



Am Mittwoch, den 09.02.2011, 22:51 +0000 schrieb Richard S. Hall
(JIRA): 
> [ 
> https://issues.apache.org/jira/browse/FELIX-2822?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
>  ]
> 
> Richard S. Hall closed FELIX-2822.
> ----------------------------------
> 
>     Resolution: Fixed
> 
> After thinking about it, I realize that the system bundle should be handled 
> differently than other bundles when the framework is stopped. Normal bundles 
> are unresolved and effectively discarded. The system bundle was being treated 
> the same way, but this was causing a problem since the framework instance can 
> be reused.
> 
> To avoid this situation, since Felix extends BundleImpl, I just overrode 
> BundleImpl.close() to do nothing. Thus, when the framework stops all bundles 
> except the system bundle are thrown away. This means that once the framework 
> is started, the system bundle continues to exist and stays in the RESOLVED 
> state forever, even after the framework stops.
> 
> This makes sense, because if you reuse the framework instance then the system 
> bundle doesn't need to be resolved again since it configuration cannot change 
> from one run to the next.
> 
> > [Framework] System bundle module's state not reset when framework restarted 
> > leading to NPE
> > ------------------------------------------------------------------------------------------
> >
> >                 Key: FELIX-2822
> >                 URL: https://issues.apache.org/jira/browse/FELIX-2822
> >             Project: Felix
> >          Issue Type: Bug
> >          Components: Framework
> >    Affects Versions: framework-3.0.8
> >            Reporter: Richard S. Hall
> >            Assignee: Richard S. Hall
> >            Priority: Minor
> >             Fix For: framework-3.2.0
> >
> >
> > Normally when a bundle is refreshed, we throw away its module and then 
> > recreate it, so we are always starting with a fresh module. For the system 
> > bundle, when we stop and restart the framework, the system bundle module is 
> > reused. When the framework is restarted, the system bundle module state is 
> > still resolved, so when we re-resolve it in Framework.init(), it doesn't 
> > get empty wires injected into it since the resolver thinks it's resolved. 
> > This leads to subsequent NPEs when the resolver tries to wire later modules 
> > to the system bundle.
> 


Reply via email to