Hi Clement,

I understand that @Modified callback is call when a modification is done on : 

* a @ServiceProperty
* and also a @Property, if and only if, the attribute "propagation=true" on the 
@Component annotation is set : that's why on my test class [DummyServiceImpl] I 
put it.

But, this is what I understand from the iPojo documentation, and I may have 
misunderstood the "propagation" concept !
Can you confirm me this behavior ?

Thanks again for you help

Regards,
David


-----Message d'origine-----
De : Clement Escoffier [mailto:[email protected]] 
Envoyé : lundi 13 juin 2011 12:16
À : [email protected]
Objet : Re: iPojo and @Modified

Hi,

The interesting thing is your case it that @Modified should not be called at 
all, as your properties are not service properties. In fact, I just fixed a bug 
triggering updates every time the instance is reconfigured regardless there are 
changes or not (https://issues.apache.org/jira/browse/FELIX-2995). Now, this 
should not happen anymore, updates are triggered only when the published 
properties are really changed.

Regards,

Clement

On 08.06.2011, at 12:07, Gay David (Annecy) wrote:

> Hi all,
>  
> While working with iPojo, I found a strange behaviors.
> I've attach a small sample to illustrate what's happen.
>  
> The strange behaviors I found is on the @Modified callback.
>  
> When a new instance is created, the @Modified callback is called just after 
> the @Bind, I think it should not because it's the first time init and not a 
> modification of a already create service. This can be seen on my sample :
>  
> -> modified create foo1 foo2
> DummyServiceImpl.updated         foo1 / foo2
> DummyServiceImpl.validate        foo1 / foo2
> Bind     : DoIt -> foo1 / foo2
> Modified : DoIt -> foo1 / foo2
> DummyServiceImpl.postRegistration        foo1 / foo2
>  
> As you see the Modified method is call just after the bind.
>  
> The other problem is when there is a reconfiguration : the @Modified callback 
> is called twice. This can be seen on my sample :
>  
> -> modified update foo10 foo20
> Modified : DoIt -> foo10 / foo20
> Modified : DoIt -> foo10 / foo20
> DummyServiceImpl.updated         foo10 / foo20
>  
> As you see the Modified method is call twice. Also note that the updated is 
> call at the end, I'm wondering if it's normal or not. If you need to change 
> some internal state in the service when configuration change, it's too late 
> for the ones that uses the service. But maybe it's a normal behavior and in 
> this case, a @PreUpdated callback would be useful.
>  
> By looking at the stack trace when the method @Modified is called, it may be 
> the Felix framework that is responsible ?
>  
> Modified : DoIt -> foo10 / foo20
>         at 
> test.ipojo.modified.DummyServiceTester.__modifiedControlService(DummyServiceTester.java:106)
>         at 
> test.ipojo.modified.DummyServiceTester.modifiedControlService(DummyServiceTester.java)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:597)
>         at org.apache.felix.ipojo.util.Callback.call(Callback.java:237)
>         at 
> org.apache.felix.ipojo.handlers.dependency.DependencyCallback.call(DependencyCallback.java:244)
>         at 
> org.apache.felix.ipojo.handlers.dependency.Dependency.invokeCallback(Dependency.java:312)
>         at 
> org.apache.felix.ipojo.handlers.dependency.Dependency.callModifyMethod(Dependency.java:337)
>         at 
> org.apache.felix.ipojo.handlers.dependency.Dependency.onServiceModification(Dependency.java:485)
>         at 
> org.apache.felix.ipojo.util.DependencyModel.manageModification(DependencyModel.java:615)
>         at 
> org.apache.felix.ipojo.util.DependencyModel.modifiedService(DependencyModel.java:497)
>         at org.apache.felix.ipojo.util.Tracker$Tracked.track(Tracker.java:676)
>         at 
> org.apache.felix.ipojo.util.Tracker$Tracked.serviceChanged(Tracker.java:647)
>         at 
> org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:871)
>         at 
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:733)
>         at 
> org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662)
>         at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3890)
>         at org.apache.felix.framework.Felix.access$000(Felix.java:79)
>         at org.apache.felix.framework.Felix$2.serviceChanged(Felix.java:728)
>         at 
> org.apache.felix.framework.ServiceRegistry.servicePropertiesModified(ServiceRegistry.java:480)
>         at 
> org.apache.felix.framework.ServiceRegistrationImpl.setProperties(ServiceRegistrationImpl.java:116)
>         at 
> org.apache.felix.ipojo.handlers.providedservice.ProvidedService.update(ProvidedService.java:447)
>         at 
> org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler.__addProperties(ProvidedServiceHandler.java:507)
>         at 
> org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler.addProperties(ProvidedServiceHandler.java)
>         at 
> org.apache.felix.ipojo.handlers.configuration.ConfigurationHandler.__propagate(ConfigurationHandler.java:479)
>         at 
> org.apache.felix.ipojo.handlers.configuration.ConfigurationHandler.propagate(ConfigurationHandler.java)
>         at 
> org.apache.felix.ipojo.handlers.configuration.ConfigurationHandler.__reconfigure(ConfigurationHandler.java:396)
>         at 
> org.apache.felix.ipojo.handlers.configuration.ConfigurationHandler.reconfigure(ConfigurationHandler.java)
>         at 
> org.apache.felix.ipojo.InstanceManager.reconfigure(InstanceManager.java:1252)
>         at 
> test.ipojo.modified.DummyServiceTester.__execute(DummyServiceTester.java:82)
>         at 
> test.ipojo.modified.DummyServiceTester.execute(DummyServiceTester.java)
>         at 
> org.apache.felix.shell.impl.Activator$ShellServiceImpl.executeCommand(Activator.java:286)
>         at 
> org.apache.felix.shell.tui.Activator$ShellTuiRunnable.run(Activator.java:184)
>         at java.lang.Thread.run(Thread.java:662)
>  
> PS : I use iPojo 1.8.0, but same behavior with iPojo 1.6.x
>  
> Thanks for your help
>  
> Regards
> David
>  
>  
>  
> <test.ipojo.modified.zip>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to