Sorry: forgot to include my code... I am performing a refresh
(see blockingRefreshBundles()). Before this code runs I am using OBR to
resolve a set of requirements. I then perform the update via the resolver.
'startedBundles' are the bundles that were started at the time the update
runs:

for (Bundle bundle : startedBundles) {
try {
if(!FelixObrUtils.isFragment(bundle))
sysBundle.getBundleContext().getBundle(bundle.getBundleId()).stop();
} catch (BundleException e) {
LOG.error("Failed to stop " + bundle.getSymbolicName(), e);
}
}
resolver.deploy(0);
blockingRefreshBundles(null, sysBundle.getBundleContext());
for (Bundle bundle : startedBundles) {
try {
if(!FelixObrUtils.isFragment(bundle))
sysBundle.getBundleContext().getBundle(bundle.getBundleId()).start();
} catch (BundleException e) {
LOG.error("Failed to restart " + bundle.getSymbolicName(), e);
}
}

protected void blockingRefreshBundles(Collection<Bundle> restartedBundles,
final BundleContext bundleContext) {
final FrameworkWiring frameworkWiring =
bundleContext.getBundle(0).adapt(FrameworkWiring.class);
if(null!=frameworkWiring) {
final CountDownLatch latch = new CountDownLatch(1);
frameworkWiring.refreshBundles(restartedBundles, new FrameworkListener() {
 @Override
public void frameworkEvent(FrameworkEvent arg0) {
if(arg0.getType()==FrameworkEvent.PACKAGES_REFRESHED) latch.countDown();
}
});
try {
latch.await();
} catch (InterruptedException e) {
LOG.error("Interrupted while waiting for packages to refresh. Will continue
anyway");
}
} else {
LOG.warn("Couldn't adapt system bundle to framework wiring so will not
refresh bundles");
}
}

Just a thought - might there be a problem in re-using the old references to
'startedBundles'? Following the update, should I refresh these instances?

Dan

On Thu, Aug 9, 2012 at 11:19 AM, Felix Meschberger <[email protected]>wrote:

> Hi
>
> I would assume you need to call PackageAdmin.refreshPackages() after
> updating the bundles, such that all providers and consumers get to know the
> latest updates.
>
> If you just to Bundle.update the call to PackageAdmin.refreshPackages must
> also be done explicitly. If you are using installation tools such as File
> Install this call would be done automatically by the installation tool
> along with updating the bundles.
>
> Regards
> Felix
>
> Am 09.08.2012 um 11:59 schrieb Dan Gravell:
>
> > Hi all. I'm getting some NoClassDefFoundErrors and other
> exceptions/errors
> > after updating some bundles. The bundles work fine before. Restarting
> Felix
> > clears the problem (no more NCDFE) and the newly updating bundles work
> fine
> > once again.
> >
> > I'd like to be able to support updating while running, if possible.
> >
> > Here's a sample stacktrace:
> >
> > 2012-08-09 10:44:56,095 [ERROR]  Error while executing
> > AutomaticFixerCoverArtCommand (AggregatedPolic
> > yCommand.java:65, thread policy pool 0)
> > java.lang.ExceptionInInitializerError
> >        at
> >
> com.elsten.bliss.music.policy.coverartpolicy.CoverArtUtils.dimensionsOf(CoverArtUtils.java
> > :163)
> >        at
> >
> com.elsten.bliss.music.policy.coverartpolicy.CoverArtUtils.openImageDimension(CoverArtUtil
> > s.java:187)
> >        [...]
> > Caused by: java.lang.NullPointerException
> >        at
> >
> org.apache.felix.framework.BundleRevisionImpl.getResourcesLocal(BundleRevisionImpl.java:510)
> >        at
> >
> org.apache.felix.framework.BundleWiringImpl.findResourcesByDelegation(BundleWiringImpl.java:1127)
> >        at
> >
> org.apache.felix.framework.BundleWiringImpl.getResourcesByDelegation(BundleWiringImpl.java:1037)
> >        at
> >
> org.apache.felix.framework.BundleWiringImpl$BundleClassLoaderJava5.getResources(BundleWiringImpl.java:1778)
> >        at
> >
> org.eclipse.jetty.osgi.boot.internal.webapp.OSGiWebappClassLoader.getResources(OSGiWebappClassLoader.java:115)
> >        at
> > java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:340)
> >        at java.util.ServiceLoader$1.hasNext(ServiceLoader.java:432)
> >        at
> >
> javax.imageio.spi.IIORegistry.registerApplicationClasspathSpis(IIORegistry.java:206)
> >        at javax.imageio.spi.IIORegistry.<init>(IIORegistry.java:138)
> >        at
> > javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:159)
> >        at javax.imageio.ImageIO.<clinit>(ImageIO.java:64)
> >
> > 2012-08-09 10:44:57,061 [ERROR]  Error while executing
> > AutomaticFixerCoverArtCommand (AggregatedPolicyCommand.java:65, thread
> > policy pool 1)
> > java.lang.NoClassDefFoundError: Could not initialize class
> > javax.imageio.ImageIO
> >        at
> >
> com.elsten.bliss.music.policy.coverartpolicy.CoverArtUtils.dimensionsOf(CoverArtUtils.java:163)
> >        at
> >
> com.elsten.bliss.music.policy.coverartpolicy.CoverArtUtils.openImageDimension(CoverArtUtils.java:187)
> >        [... no caused by trace here...]
> >
> > Immediately before that I get something I only see once I enable Felix
> > debug logging:
> >
> > ERROR: Bundle com.elsten.bliss.ui [34] Unable to get module class path.
> > (java.lang.NullPointerExcepti
> > on)
> > java.lang.NullPointerException
> >        at
> >
> org.apache.felix.framework.BundleRevisionImpl.calculateContentPath(BundleRevisionImpl.java
> > :410)
> >        at
> >
> org.apache.felix.framework.BundleRevisionImpl.initializeContentPath(BundleRevisionImpl.jav
> > a:347)
> >        at
> >
> org.apache.felix.framework.BundleRevisionImpl.getContentPath(BundleRevisionImpl.java:333)
> >        at
> >
> org.apache.felix.framework.BundleRevisionImpl.getResourcesLocal(BundleRevisionImpl.java:49
> > 3)
> >        at
> >
> org.apache.felix.framework.BundleWiringImpl.findResourcesByDelegation(BundleWiringImpl.jav
> > a:1127)
> >        at
> >
> org.apache.felix.framework.BundleWiringImpl.getResourcesByDelegation(BundleWiringImpl.java
> > :1037)
> >        at
> >
> org.apache.felix.framework.BundleWiringImpl$BundleClassLoaderJava5.getResources(BundleWiri
> > ngImpl.java:1778)
> >        at
> >
> org.eclipse.jetty.osgi.boot.internal.webapp.OSGiWebappClassLoader.getResources(OSGiWebappC
> > lassLoader.java:115)
> >        at
> > java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:340)
> >        at java.util.ServiceLoader$1.hasNext(ServiceLoader.java:432)
> >        at
> >
> javax.imageio.spi.IIORegistry.registerApplicationClasspathSpis(IIORegistry.java:206)
> >        at javax.imageio.spi.IIORegistry.<init>(IIORegistry.java:138)
> >        at
> > javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:159)
> >        at javax.imageio.ImageIO.<clinit>(ImageIO.java:64)
> >        at
> >
> com.elsten.bliss.music.policy.coverartpolicy.CoverArtUtils.dimensionsOf(CoverArtUtils.java
> > :163)
> >        at
> >
> com.elsten.bliss.music.policy.coverartpolicy.CoverArtUtils.openImageDimension(CoverArtUtil
> > s.java:187)
> >
> > There are many of these NCDFEs but only one of those NPEs in
> > BundleRevisionImpl. Once those have been thrown, "all hell seems to break
> > loose" and I start getting NCDFEs for other classes including my own.
> Does
> > the original exception cause these downstream ones or are they unrelated?
> >
> > During the update the Import-Package statements for javax.imageio.*
> remain
> > stable.
> >
> > Let me know if more contextual logs are useful. I can provide the actual
> > code that's running if it helps (it's large though).
> >
> > Dan
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to