Yes, its that!! Using refresh, the framework do not allow the launching of the vigia bundle and then the service because vigia depends on service! Without refresh, maybe vigia is using a zombie service.
Now, I do stop to the service and start and these events are now reported! How sad... Thanks a lot karl and Richard ... Alex On Fri, Feb 15, 2013 at 1:03 AM, Karl Pauls <[email protected]> wrote: > try to call: > > refresh > > after each uninstall > > regards, > > Karl > > > On Fri, Feb 15, 2013 at 1:36 AM, Imóveis Nacionais < > [email protected]> wrote: > > > Hi Richard, here it is... > > > > > > > > Use the first zip for this first test case. > > > > > > > > vigia-1.0.jar has just print instructions in the serviceChanged (source > > code is also in attachment) > > > > MyOSGi-1.0-SNAPSHOT.jar is a sample service bundle > > > > MyBundleServer-1.0-SNAPSHOT.jar is another sample service bundle > > > > Test this stuff like this : > > > > > > g! install file:/C:/PROJS/OSGi/felix-framework-4.0.3/vigia-1.0.jar > > > > Bundle ID: 86 > > > > g! start 86 > > > > Client bundle initializing on start method... > > > > g! > > > > > > > > then: > > > > > > > > g! install > > file:/C:/PROJS/OSGi/felix-framework-4.0.3/MyOSGi-1.0-SNAPSHOT.jar > > > > Bundle ID: 88 > > > > g! start 88 > > > > Server bundle start method initializing > > > > > > > > > > > > serviceChanged called... > > > > Gestting description... > > > > ->This an service impl object > > > > > > > > > > > > O serviþo foi registado! //Means service was registered, in > > english > > > > g! > > > > > > > > Then > > > > > > > > g! install > > file:/C:/PROJS/OSGi/felix-framework-4.0.3/MyBundleServer-1.0-SNAPSHOT > > > > .jar > > > > Bundle ID: 89 > > > > g! start 89 > > > > Server bundle start method initializing > > > > > > > > > > > > serviceChanged called... > > > > Gestting description... > > > > ->GET_NUMBER_SERVICE > > > > > > > > > > > > O serviþo foi registado! > > > > g! > > > > > > > > > > > > As you can see the 'global service' listener works well. > > > > > > > > > > > > Now do the uninstallation of the 3 bundles: > > > > > > > > g! uninstall 89 > > > > > > > > > > > > serviceChanged called... > > > > Gestting description... > > > > ->GET_NUMBER_SERVICE > > > > > > > > > > > > g! uninstall 88 > > > > Goodbye OSGi World > > > > > > > > > > > > serviceChanged called... > > > > Gestting description... > > > > ->This an service impl object > > > > > > > > > > > > g! uninstall 86 > > > > g! > > > > > > > > > > > > Now use the second zip file. In this zip file, vigia-1.0.jar has print > > instructions in the serviceChanged but also an attempt to get a reference > > for a service and a call to the service (source code is also in > attachment > > for vigia and for the project where interface is exported) > > > > > > g! install file:/C:/PROJS/OSGi/felix-framework-4.0.3/vigia-1.0.jar > > > > Bundle ID: 90 > > > > g! start 90 > > > > Client bundle initializing on start method... > > > > > > > > Then > > > > > > > > g! install > > file:/C:/PROJS/OSGi/felix-framework-4.0.3/MyOSGi-1.0-SNAPSHOT.jar > > > > Bundle ID: 91 > > > > g! start 91 > > > > Server bundle start method initializing > > > > > > > > > > > > serviceChanged called... > > ->CALLED > > > > Gestting description... > > > > ->This an service impl object > > > > > > > > > > > > O serviþo foi registado! > > > > g! > > > > > > > > > > > > and then: > > > > g! install > > file:/C:/PROJS/OSGi/felix-framework-4.0.3/MyBundleServer-1.0-SNAPSHOT > > > > .jar > > > > Bundle ID: 94 > > -> serviceChanged NOT CALLED! > > > > g! start 94 > > > > Server bundle start method initializing > > > > O serviþo foi registado! > > > > > > > > > > > > As you see the serviceChanged was not called this time. Even if you > > remove all the code from serviceChanged and let only the prints and the > > import, it is not called either. If you comment the code in > serviceChanged > > (let only the prints) and comment the import statement, then the > > serviceChanged is called. > > > > > > > > I am trying to understand this behavior... Thanks a lot > > > > > > > > Alex > > > > > > > > > > > > > > On Thu, Feb 14, 2013 at 11:44 PM, Richard S. Hall <[email protected] > >wrote: > > > >> If you want to create me a simple example of two bundles (one client and > >> one server) where the client can't see the other, I'll take a look at it > >> and try to explain what is going on...from your description, I'm still > not > >> sure what precisely is triggering the situation. > >> > >> -> richard > >> > >> > >> On 2/14/13 6:40 PM, Imóveis Nacionais wrote: > >> > >>> My "AllServiceListener" takes place when serviceChanged( ) has just a > >>> print > >>> to console. In this situation all osgi services fire the > serviceChanged() > >>> method. > >>> > >>> The problem appears when I build a 'special listener' (for example for > >>> BundleService1 as i said) in order to fill an handle to the service to > be > >>> called later. In this situation, to declare a variable of service1 > >>> interface to save the service object reference, I have to put the > import > >>> statement and the special listener does not detects service1 anymore, > >>> only > >>> service 2,3, 4,etc... > >>> > >>> May be i am using ServiceListener in a worng way, but it is logic for > me > >>> to > >>> get the pointer to the service when it is up... > >>> > >>> Thanks > >>> > >>> Alex > >>> > >>> > >>> > >>> > >>> On Thu, Feb 14, 2013 at 6:55 PM, Richard S. Hall <[email protected] > >>> >wrote: > >>> > >>> The OSGi framework attempts to deliver service events that are usable > by > >>>> your bundle (i.e., class compatible), so by having or not having > imports > >>>> and depending on the provider of your imports you may or may not see > >>>> events > >>>> if the framework thinks they might cause you class cast problems. > >>>> > >>>> If you want to test this out, you can implement *AllServiceListener* > as > >>>> a > >>>> > >>>> test to see if you get all events; this listener will get all service > >>>> event > >>>> irrespective of whether they might cause class cast exceptions. > >>>> > >>>> Generally, you only want to use an "all" listener if you are > monitoring > >>>> an > >>>> entire system, but not really interacting with services (or are using > >>>> reflection to do so). Normally, you only want the framework sending > >>>> events > >>>> to service you can access without a class cast exception using the > >>>> normal > >>>> ServiceListener. > >>>> > >>>> -> richard > >>>> > >>>> p.s. For completeness, here a description of what the Felix framework > >>>> tries to do from ServiceRegistrationImpl.java: > >>>> > >>>> // There are four situations that may occur here: > >>>> // 1. Neither the requester, nor provider have wires > for > >>>> the > >>>> package. > >>>> // 2. The requester does not have a wire for the > package. > >>>> // 3. The provider does not have a wire for the > package. > >>>> // 4. Both the requester and provider have a wire for > the > >>>> package. > >>>> // For case 1, if the requester does not have access to > the > >>>> class at > >>>> // all, we assume it is using reflection and do not > >>>> filter. If > >>>> the > >>>> // requester does have access to the class, then we make > >>>> sure > >>>> it is > >>>> // the same class as the service. For case 2, we do not > >>>> filter > >>>> if the > >>>> // requester is the exporter of the package to which the > >>>> provider of > >>>> // the service is wired. Otherwise, as in case 1, if the > >>>> requester > >>>> // does not have access to the class at all, we do not > >>>> filter, > >>>> but if > >>>> // it does have access we check if it is the same class > >>>> accessible to > >>>> // the providing revision. For case 3, the provider will > >>>> not > >>>> have a wire > >>>> // if it is exporting the package, so we determine if the > >>>> requester > >>>> // is wired to it or somehow using the same class. For > >>>> case 4, > >>>> we > >>>> // simply compare the exporting revisions from the > package > >>>> wiring to > >>>> // determine if we need to filter the service reference. > >>>> > >>>> > >>>> On 2/14/13 11:50 , Imóveis Nacionais wrote: > >>>> > >>>> Hi all, me again… > >>>>> > >>>>> > >>>>> Suppose you have the following OSGi bundles and the related exposed > >>>>> services: > >>>>> > >>>>> BundleService1 -> exports service 1 and interface for service 1 > >>>>> > >>>>> BundleService2 -> exports service 2 and interface for service 2 > >>>>> > >>>>> > >>>>> > >>>>> Now I want to write the Bundle3 which will use both Service1 and > >>>>> Service2 > >>>>> (for now, just service1). > >>>>> > >>>>> So, Bundle3 (activator class) implements BundleActivator and > >>>>> ServiceListener. > >>>>> > >>>>> On start() I do: context.addServiceListener(****this); > >>>>> > >>>>> > >>>>> On the serviceChanged() method I simply have a print to console. > >>>>> > >>>>> This works with no problem. > >>>>> > >>>>> ------------------------------****----------------------------**--** > >>>>> ------------------------------****------------------ > >>>>> > >>>>> > >>>>> Suppose now that you want to call service1 from serviceChanged method > >>>>> (just > >>>>> an example!): > >>>>> > >>>>> To call service1 I need to add dependence to pom.xml for > >>>>> BundleService1 in > >>>>> order to get reference and cast the reference to the service1 > >>>>> interface. > >>>>> > >>>>> Then, on the activator class I need to put an import for the service1 > >>>>> interface. Then I get the reference, evaluate the property, cast it > to > >>>>> service1 and call the service1. > >>>>> > >>>>> > >>>>> Now, testing this stuff: > >>>>> > >>>>> I install Bundle3 and start it. > >>>>> > >>>>> I install BundleService1 and start it. Nothing happens on bundle3 > >>>>> serviceChanged!!! > >>>>> > >>>>> Then I install BundleService2 and start it. The bundle3 > serviceChanged > >>>>> is > >>>>> called!!! > >>>>> > >>>>> > >>>>> If I install and start any other bundles serviceChanged is always > >>>>> called, > >>>>> except for BundleService1! > >>>>> > >>>>> If I remove the import directive from Bundle3 (while the POM > dependence > >>>>> remains) and comment the related code, Bundle3 serviceChanged is > called > >>>>> for > >>>>> BundleService1! > >>>>> > >>>>> > >>>>> > >>>>> My conclusion is that, the ServiceListener only works for those > bundles > >>>>> that have no “connection” (import) with Bundle3. Is this true? > >>>>> > >>>>> If this is true, how can I get the reference and cast to the service > in > >>>>> order to call it without using imports? > >>>>> > >>>>> > >>>>> > >>>>> Note: In an attempt to solve the problem I did the following: in the > >>>>> serviceChanged I called another bundle3 class giving it the event in > >>>>> order > >>>>> to remove the import from activator class, and move it to the other > >>>>> class. > >>>>> But serviceChanged did not detects the Service1 too. It seems that if > >>>>> the > >>>>> (client) bundle project has an import for some service bundles those > >>>>> bundles are not “detected” in the serviceChanged method. > >>>>> > >>>>> > >>>>> > >>>>> Thank you > >>>>> > >>>>> Alex > >>>>> > >>>>> > >>>>> ------------------------------****----------------------------** > >>>> --**--------- > >>>> To unsubscribe, e-mail: users-unsubscribe@felix.**apac**he.org< > http://apache.org> > >>>> <users-unsubscribe@**felix.apache.org< > [email protected]> > >>>> > > >>>> > >>>> For additional commands, e-mail: [email protected] > >>>> > >>>> > >>>> > >> > >> > ------------------------------**------------------------------**--------- > >> To unsubscribe, e-mail: users-unsubscribe@felix.**apache.org< > [email protected]> > >> For additional commands, e-mail: [email protected] > >> > >> > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [email protected] > > For additional commands, e-mail: [email protected] > > > > > > -- > Karl Pauls > [email protected] > http://twitter.com/karlpauls > http://www.linkedin.com/in/karlpauls > https://profiles.google.com/karlpauls >

