On 2/10/11 2:02, Felix Meschberger wrote:
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.
It does not contradict the documentation, consider 4.2.3 which states:
stop – Move the framework into the RESOLVED state via the STOPPING
state. This will return a Framework STOPPED event from the
waitForStop method. The Framework's Bundle Context is no longer
valid. The framework must be initialized again to get a new, valid
BundleContext. The stop method can be called on the framework or on
the system bundle.
So, this is what I am saying. Stopping the framework does NOT move it
back to the INSTALLED state, it moves it back to the RESOLVED state.
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)
I believe with the currently released framework, this could lead to NPEs
as described in the issue. Although, if you are not ever seeing them, I
am not sure why. Also note that you should not need to stop the
framework unless you are updating a framework extension bundle.
Installing a framework extension bundle should take effect immediately.
* 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 ;-)
I'll let Karl comment on the specifics here, since he implemented this
part. However, system bundle fragments are handled differently than
normal bundles. When you stop the framework, all bundles should be
refreshed if needed (i.e., if you updated any). When you restart, all
bundles are reinstalled including framework extensions, which should be
available immediately. Still, if you've loaded classes from previously
attached framework extensions, these classes cannot go away until you
completely throw away the class loader that loaded the framework, if I
understand correctly.
Karl?
In short, though, nothing I've done will prevent you from stopping a
framework and restarting it...or at least it shouldn't.
-> richard
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.