On 4/9/09 10:14 AM, Pierre De Rop wrote:
Hello everyone,

I just discovered that invoking Bundle.update() method may fire a framework event PACKAGES_REFRESHED event. In the trunk, I see, in Felix.java, line 1691, that the "update" method may invoke the refreshPackage(null) method, which then fires the event.

To be clear, it only invokes refreshPackages() on the bundle being updated, not all bundles.

I understand this issue this causes for you, but I am not sure of a solution. We could possibly add a configuration to turn off auto-refreshing, but this would really just tie you to Felix since other implementations may still auto-refresh.

What you really need is for the call to refreshPackages() to return some sort of request ID so you can check for when your request is finished.

-> richard

Is is a normal behavior ?
So far, I was fairly certain that this event was only fired after invoking PackageAdmin.refreshPackages() methods. Actually, we are using our own bundle installer, which install/updates our bundles.
And our bundle installer does the following, when it updates a bundle:

class BundleInstaller implements FrameworkListener {
 boolean refreshing = false;

 void update(Bundle([] bundles) {
   for (Bundle b : bundles) {
      b.stop();
      b.update(); // May fire a PACKAGES_REFRESHED event
   }

   synchronized (this) {
     this.refreshing = true;
   }
   *packageAdmin.refresh(null); // asynchronous *

   synchronized (this) {
*while (refreshing) wait(); *// ensure that all bundles are refreshed before restarting updated bundles.
   }

   for (Bundle b : bundles) {
      b.start();
   }
 }

 // Here, I listen to the framework event "PACKAGES_REFRESHED"
 void frameworkEvent(FrameworkEvent event) {
    switch (event.getType()) {
       case FrameworkEvent.PACKAGES_REFRESHED:
       synchronized (this) {
          this.refreshing = false;
          notify();
       }
     }
 }
}

The problem here, is that the first loop of my method "update" invokes Bundle.update(), which may fire some unexpected PACKAGES_REFRESHED events ... I'm expecting only one, and my waiting loop exits after the first event received.

So, what can I do in order to ensure that the PackageAdmin.refreshPackages(null) method has completed ?

Thanks in advance;
/pierre





---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
For additional commands, e-mail: users-h...@felix.apache.org

Reply via email to