[ https://issues.apache.org/jira/browse/AXIS2-4847?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13902705#comment-13902705 ]
Andreas Veithen commented on AXIS2-4847: ---------------------------------------- First of all, I agree with Ancoron Luciferis that the current code uses managed services in a very strange way. In addition to the points already mentioned, one can also note that the code actually doesn't use the configuration provided by the configuration manager at all... But let's for the moment concentrate on the issue that causes the error. If I understand this correctly, there are two issues: 1. The code shouldn't call the "updated" method synchronously and instead let the config admin call it asynchronously. 2. To register the servlet, one needs a reference to the HttpService as well as the ConfigurationContext. In the current code there is a service tracker (see the Activator.HttpServiceTracker) that looks for HttpService and once that service becomes available, it uses getServiceReference/getService to get a reference to the ConfigurationContext. That pattern is of course incorrect because it assumes that the ConfigurationContext is already registered when the HttpService becomes available, but that is not necessarily the case. The thing is that if one addresses problem 1 by removing the call to the "updated" method in the bundle activator (as Andy did in his patch), then one runs inevitably into the second issue. Andy's patch addresses problem 2 by using SCR because that makes it easy to express a dependency on multiple services that must be available at the same time. I was wondering if it would not more elegant to use a different approach based on the [whiteboard pattern|http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html#using-the-whiteboard]. In that case, one would simply have a ServiceTracker that looks for the ConfigurationContext and then registers the HttpServlet as an OSGi service. The HTTP whiteboard support would then register that servlet automatically with the HttpService, i.e. the Axis2 code no longer depends directly on HttpService. > IllegalStateException: Can only register services while bundle is active or > activating. > --------------------------------------------------------------------------------------- > > Key: AXIS2-4847 > URL: https://issues.apache.org/jira/browse/AXIS2-4847 > Project: Axis2 > Issue Type: Bug > Affects Versions: 1.5.1 > Environment: Apache Felix Framework 3.0.2 > Reporter: Ancoron Luciferis > Attachments: AXIS2-4847.patch > > > I'm trying to run the axis2 OSGi version 1.5.1 inside a GlassFish 3.1 > (promoted build 23 currently) and facing the following problem: > *ERROR* [org.osgi.service.cm.ManagedService, id=68, bundle=280]: Unexpected > problem updating null > java.lang.IllegalStateException: Can only register services while bundle is > active or activating. > at org.apache.felix.framework.Felix.registerService(Felix.java:2817) > at > org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:251) > at > org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:229) > at > org.apache.axis2.osgi.deployment.OSGiConfigurationContextFactory.updated(OSGiConfigurationContextFactory.java:107) > at > org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.run(ConfigurationManager.java:1112) > at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:88) > And because of that I then get: > org.osgi.framework.BundleException: Activator start error in bundle > org.apache.axis2.osgi [280]. > at org.apache.felix.framework.Felix.activateBundle(Felix.java:1864) > at org.apache.felix.framework.Felix.startBundle(Felix.java:1734) > at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:905) > at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:892) > at com.profitbricks.osgi.test.FelixTest.testModules(FelixTest.java:241) > Caused by: java.lang.NullPointerException: Specified service reference cannot > be null. > at > org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:319) > at > org.apache.axis2.osgi.internal.Activator$HttpServiceTracker.addingService(Activator.java:79) > at > org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:896) > at > org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:261) > at > org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:184) > at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:339) > at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:273) > at org.apache.axis2.osgi.internal.Activator.start(Activator.java:50) > at > org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:633) > at org.apache.felix.framework.Felix.activateBundle(Felix.java:1817) > ... 33 more > When I read the code I don't really understand why the implementor chose > "ManagedService" for the "OSGiConfigurationContextFactory" as it really > should be a "ManagedServiceFactory". Additionally manually invoking the > "updated" method within the activator code is counter-productive, as it is > called automatically (and must be called asynchronously) by the OSGi > Config-Admin. > See sections 104.15.9 and 104.15.10 of the OSGi Compendium spec v4.2. -- This message was sent by Atlassian JIRA (v6.1.5#6160) --------------------------------------------------------------------- To unsubscribe, e-mail: java-dev-unsubscr...@axis.apache.org For additional commands, e-mail: java-dev-h...@axis.apache.org