[
https://issues.apache.org/jira/browse/FELIX-1866?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Felix Meschberger updated FELIX-1866:
-------------------------------------
Fix Version/s: scr-1.2.2
> SCR 1.1 restarts components when service properties are changed, even if
> "modified" attributed is specified
> -----------------------------------------------------------------------------------------------------------
>
> Key: FELIX-1866
> URL: https://issues.apache.org/jira/browse/FELIX-1866
> Project: Felix
> Issue Type: Bug
> Components: Declarative Services (SCR)
> Affects Versions: scr-1.2.0
> Environment: linux, jdk1.5
> Reporter: Pierre De Rop
> Fix For: scr-1.2.2
>
>
> Hi everyone,
> This issue is described here:
> http://www.mail-archive.com/[email protected]/msg13733.html
> I'm using the following xml descriptor in order to be notified when a service
> configuration property is modified from CM (I use the modify attribute):
> <?xml version="1.0" encoding="utf-8"?>
> <components xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
> <scr:component name="englishdico" modified="updated"
> configuration-policy="require">
> <service>
> <provide interface="com.alcatel_lucent.dictionary.DictionaryService"/>
> </service>
> <property name="Language" value="en"/>
> <implementation
> class="com.alcatel_lucent.dictionary.english.EnglishDictionary" />
> </scr:component>
> </components>
> I also use CM 1.2.4 and when I programatically re-configure my
> "EnglishDictionary" component like this:
> class Updater {
> ConfigurationAdmin _cm;
> void update(String pid, Dictionary update) {
> Configuration conf = _cm.getConfiguration(pid, null);
> if (config.getBundleLocation() != null)
> {
> config.setBundleLocation(null);
> }
> config.update(update);
> }
> }
> Then my EnglishDictionary is properly invoked in its "updated" method
> (because I have configured a "modified" attribute).
> But ... the EnglishDictionary is deactivated and then reactivated.
> Is it a normal behavior or a bug ?
> I provide here the stacktrace, when the component is deactivated. may be it
> will help:
> at
> com.alcatel_lucent.dictionary.english.EnglishDictionary.deactivate(EnglishDictionary.java:20)
> 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.scr.impl.helper.BaseMethod.invokeMethod(BaseMethod.java:213)
> at
> org.apache.felix.scr.impl.helper.BaseMethod.access$500(BaseMethod.java:38)
> at
> org.apache.felix.scr.impl.helper.BaseMethod$Resolved.invoke(BaseMethod.java:542)
> at org.apache.felix.scr.impl.helper.BaseMethod.invoke(BaseMethod.java:434)
> at
> org.apache.felix.scr.impl.helper.ActivateMethod.invoke(ActivateMethod.java:138)
> at
> org.apache.felix.scr.impl.manager.ImmediateComponentManager.disposeImplementationObject(ImmediateComponentManager.java:259)
> at
> org.apache.felix.scr.impl.manager.ImmediateComponentManager.deleteComponent(ImmediateComponentManager.java:134)
> at
> org.apache.felix.scr.impl.manager.DelayedComponentManager.deleteComponent(DelayedComponentManager.java:66)
> at
> org.apache.felix.scr.impl.manager.AbstractComponentManager$Active.ungetService(AbstractComponentManager.java:1094)
> at
> org.apache.felix.scr.impl.manager.DelayedComponentManager.ungetService(DelayedComponentManager.java:100)
> at
> org.apache.felix.framework.ServiceRegistrationImpl.ungetFactoryUnchecked(ServiceRegistrationImpl.java:346)
> at
> org.apache.felix.framework.ServiceRegistrationImpl.ungetService(ServiceRegistrationImpl.java:259)
> at
> org.apache.felix.framework.ServiceRegistry.ungetService(ServiceRegistry.java:401)
> at org.apache.felix.framework.Felix.ungetService(Felix.java:2888)
> at
> org.apache.felix.framework.BundleContextImpl.ungetService(BundleContextImpl.java:370)
> at
> org.apache.felix.scr.impl.manager.DependencyManager.ungetService(DependencyManager.java:759)
> at
> org.apache.felix.scr.impl.manager.DependencyManager.serviceRemoved(DependencyManager.java:390)
> at
> org.apache.felix.scr.impl.manager.DependencyManager.serviceChanged(DependencyManager.java:177)
> at
> org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:878)
> at
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:732)
> at
> org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662)
> at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3587)
> at org.apache.felix.framework.Felix.access$000(Felix.java:40)
> at org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:625)
> at
> org.apache.felix.framework.ServiceRegistry.servicePropertiesModified(ServiceRegistry.java:505)
> at
> org.apache.felix.framework.ServiceRegistrationImpl.setProperties(ServiceRegistrationImpl.java:116)
> at
> org.apache.felix.scr.impl.manager.ImmediateComponentManager.modify(ImmediateComponentManager.java:472)
> at
> org.apache.felix.scr.impl.manager.ImmediateComponentManager.reconfigure(ImmediateComponentManager.java:401)
> at
> org.apache.felix.scr.impl.config.ConfiguredComponentHolder.configurationUpdated(ConfiguredComponentHolder.java:187)
> at
> org.apache.felix.scr.impl.config.ConfigurationComponentRegistry.configurationEvent(ConfigurationComponentRegistry.java:173)
> at
> org.apache.felix.cm.impl.ConfigurationManager$FireConfigurationEvent.run(ConfigurationManager.java:1693)
> at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:88)
> -> I am wondering if the service is re-activated just because the service
> configuration is re-propagated in the published service properties ?
> -> I have also noticed that now, with DS 1.1, properties which are prefixed
> with a dot (".") are not supposed to be propagated in the published service
> properties.
> Indeed, in the spec, I see the following, page 331, in chapter 112.11:
> "SCR must follow the recommendations of Property Propagation on page
> 86 and not propagate properties whose names start with '.' to service
> properties"
> So, I prefixed my english dictionary property with a ".", and I then invoked
> the org.osgi.service.cm.Configuration.update(Dictionary method), just to see
> if it resolved the problem,
> but I came across another exception. However, this exception comes from CM (I
> use CM 1.2.4 release):
> Throwable
> java.lang.IllegalArgumentException: Key [.englishdico.jdbcURL] must not start
> or end with a dot
> at
> org.apache.felix.cm.impl.CaseInsensitiveDictionary.checkKey(CaseInsensitiveDictionary.java:265)
> at org.apache.felix.cm.impl.CaseInsensitiveDictionary.
> (CaseInsensitiveDictionary.java:72)
> at
> org.apache.felix.cm.impl.ConfigurationImpl.update(ConfigurationImpl.java:278)
> at
> org.apache.felix.cm.impl.ConfigurationAdapter.update(ConfigurationAdapter.java:110)
> at
> com.alcatel.as.service.config.impl.fc.OsgiConfigurationAdmin$Conf.update(OsgiConfigurationAdmin.java:237)
> at
> com.alcatel.as.service.config.impl.fc.OsgiConfigurationAdmin$Conf.update(OsgiConfigurationAdmin.java:214)
> at
> com.alcatel.as.service.config.impl.fc.OsgiConfigurationAdmin$Conf.access$000(OsgiConfigurationAdmin.java:166)
> at
> com.alcatel.as.service.config.impl.fc.OsgiConfigurationAdmin.configure(OsgiConfigurationAdmin.java:126)
> at
> com.alcatel.as.service.config.impl.fc.FastCacheConfig.init2(FastCacheConfig.java:262)
> at
> com.alcatel.as.service.config.impl.fc.FastCacheConfig.proxyAppPropertiesUpdated(FastCacheConfig.java:290)
> at
> com.nextenso.mgmt.reporter.ProxyAppReporter$FastCacheListeningThread.run(ProxyAppReporter.java:180)
> Did I make something wrong at all ?
> Best Regards;
> /pierre
>
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.