You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hivemind.apache.org by "Knut Wannheden (JIRA)" <hi...@jakarta.apache.org> on 2005/04/27 14:34:25 UTC
[jira] Closed: (HIVEMIND-99) ObjectProvider.provideObject() called twice for a single request
[ http://issues.apache.org/jira/browse/HIVEMIND-99?page=all ]
Knut Wannheden closed HIVEMIND-99:
----------------------------------
Resolution: Fixed
Fix Version: 1.1
BuilderPropertyFacet now caches the translated values as suggested by Achim Hügen. As the target type specified by the client may vary the translated values are cached on a type basis.
> ObjectProvider.provideObject() called twice for a single request
> ----------------------------------------------------------------
>
> Key: HIVEMIND-99
> URL: http://issues.apache.org/jira/browse/HIVEMIND-99
> Project: HiveMind
> Type: Improvement
> Components: framework
> Versions: 1.1
> Environment: jdk 1.5, Win2k
> Reporter: Stefan Liebig
> Priority: Minor
> Fix For: 1.1
>
> I wrote an object provider for injecting web services into another service.
> This hivemind fragment shows it declaration:
> <service-point id="PingHolder" interface="de.compeople.spirit.communication.base.mikrokernel.objectprovider.IPingHolder">
> <invoke-factory>
> <construct class="de.compeople.spirit.communication.base.mikrokernel.objectprovider.PingHolder" autowire-services="false">
> <object>web-service:Ping</object>
> </construct>
> </invoke-factory>
> </service-point>
> A web service has a logical name (Ping) and its type is derived from the injected property/contructor parameter.
> This provider works quite well, but while debugging I recognised that the provideObject() method within the object provider
> is called twice. From eclipse I have the two stacktraces where it stops (breakpoint) in the object provider:
> Thread [main] (Suspended (breakpoint at line 42 in de.compeople.spirit.communication.base.microkernel.objectprovider.WebServiceObjectProvider))
> de.compeople.spirit.communication.base.microkernel.objectprovider.WebServiceObjectProvider.provideObject(org.apache.hivemind.internal.Module, java.lang.Class, java.lang.String, org.apache.hivemind.Location) line: 42
> $ObjectProvider_1027bec98d2.provideObject(org.apache.hivemind.internal.Module, java.lang.Class, java.lang.String, org.apache.hivemind.Location) line: not available
> org.apache.hivemind.service.impl.ObjectTranslator.translate(org.apache.hivemind.internal.Module, java.lang.Class, java.lang.String, org.apache.hivemind.Location) line: 75
> $Translator_1027bec98c2.translate(org.apache.hivemind.internal.Module, java.lang.Class, java.lang.String, org.apache.hivemind.Location) line: not available
> org.apache.hivemind.service.impl.BuilderPropertyFacet.getFacetValue(org.apache.hivemind.ServiceImplementationFactoryParameters, java.lang.Class) line: 41
> org.apache.hivemind.service.impl.BuilderFactoryLogic.instantiateExplicitConstructorInstance(java.lang.Class, java.util.List) line: 135
> ===========
> org.apache.hivemind.service.impl.BuilderFactoryLogic.instantiateCoreServiceInstance() line: 112
> org.apache.hivemind.service.impl.BuilderFactoryLogic.createService() line: 77
> org.apache.hivemind.service.impl.BuilderFactory.createCoreServiceImplementation(org.apache.hivemind.ServiceImplementationFactoryParameters) line: 42
> org.apache.hivemind.impl.InvokeFactoryServiceConstructor.constructCoreServiceImplementation() line: 84
> org.apache.hivemind.impl.servicemodel.SingletonServiceModel(org.apache.hivemind.impl.servicemodel.AbstractServiceModelImpl).constructCoreServiceImplementation() line: 106
> org.apache.hivemind.impl.servicemodel.SingletonServiceModel(org.apache.hivemind.impl.servicemodel.AbstractServiceModelImpl).constructNewServiceImplementation() line: 156
> org.apache.hivemind.impl.servicemodel.SingletonServiceModel(org.apache.hivemind.impl.servicemodel.AbstractServiceModelImpl).constructServiceImplementation() line: 138
> org.apache.hivemind.impl.servicemodel.SingletonServiceModel.getActualServiceImplementation() line: 68
> $IPingHolder_1027bec98eb._service() line: not available
> $IPingHolder_1027bec98eb.getPing() line: not available
> $IPingHolder_1027bec98ea.getPing() line: not available
> de.compeople.spirit.communication.base.mikrokernel.objectprovider.WebServiceObjectProviderUsageTest.testBuildWebServiceWithoutTimeoutAndConstructorInjection() line: 39
> sun.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) line: not available [native method]
> sun.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 39
> sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 25
> java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object...) line: 585
> de.compeople.spirit.communication.base.mikrokernel.objectprovider.WebServiceObjectProviderUsageTest(junit.framework.TestCase).runTest() line: 154
> de.compeople.spirit.communication.base.mikrokernel.objectprovider.WebServiceObjectProviderUsageTest(junit.framework.TestCase).runBare() line: 127
> junit.framework.TestResult$1.protect() line: 106
> junit.framework.TestResult.runProtected(junit.framework.Test, junit.framework.Protectable) line: 124
> junit.framework.TestResult.run(junit.framework.TestCase) line: 109
> de.compeople.spirit.communication.base.mikrokernel.objectprovider.WebServiceObjectProviderUsageTest(junit.framework.TestCase).run(junit.framework.TestResult) line: 118
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(java.lang.String[], java.lang.String) line: 598
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run() line: 354
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(java.lang.String[]) line: 219
> Thread [main] (Suspended (breakpoint at line 42 in de.compeople.spirit.communication.base.microkernel.objectprovider.WebServiceObjectProvider))
> de.compeople.spirit.communication.base.microkernel.objectprovider.WebServiceObjectProvider.provideObject(org.apache.hivemind.internal.Module, java.lang.Class, java.lang.String, org.apache.hivemind.Location) line: 42
> $ObjectProvider_1027bec98d3.provideObject(org.apache.hivemind.internal.Module, java.lang.Class, java.lang.String, org.apache.hivemind.Location) line: not available
> $ObjectProvider_1027bec98d2.provideObject(org.apache.hivemind.internal.Module, java.lang.Class, java.lang.String, org.apache.hivemind.Location) line: not available
> org.apache.hivemind.service.impl.ObjectTranslator.translate(org.apache.hivemind.internal.Module, java.lang.Class, java.lang.String, org.apache.hivemind.Location) line: 75
> $Translator_1027bec98c2.translate(org.apache.hivemind.internal.Module, java.lang.Class, java.lang.String, org.apache.hivemind.Location) line: not available
> org.apache.hivemind.service.impl.BuilderPropertyFacet.getFacetValue(org.apache.hivemind.ServiceImplementationFactoryParameters, java.lang.Class) line: 41
> org.apache.hivemind.service.impl.BuilderPropertyFacet.isAssignableToType(org.apache.hivemind.ServiceImplementationFactoryParameters, java.lang.Class) line: 54
> org.apache.hivemind.service.impl.BuilderFactoryLogic.instantiateExplicitConstructorInstance(java.lang.Class, java.util.List) line: 132
> ===========
> org.apache.hivemind.service.impl.BuilderFactoryLogic.instantiateCoreServiceInstance() line: 112
> org.apache.hivemind.service.impl.BuilderFactoryLogic.createService() line: 77
> org.apache.hivemind.service.impl.BuilderFactory.createCoreServiceImplementation(org.apache.hivemind.ServiceImplementationFactoryParameters) line: 42
> org.apache.hivemind.impl.InvokeFactoryServiceConstructor.constructCoreServiceImplementation() line: 84
> org.apache.hivemind.impl.servicemodel.SingletonServiceModel(org.apache.hivemind.impl.servicemodel.AbstractServiceModelImpl).constructCoreServiceImplementation() line: 106
> org.apache.hivemind.impl.servicemodel.SingletonServiceModel(org.apache.hivemind.impl.servicemodel.AbstractServiceModelImpl).constructNewServiceImplementation() line: 156
> org.apache.hivemind.impl.servicemodel.SingletonServiceModel(org.apache.hivemind.impl.servicemodel.AbstractServiceModelImpl).constructServiceImplementation() line: 138
> org.apache.hivemind.impl.servicemodel.SingletonServiceModel.getActualServiceImplementation() line: 68
> $IPingHolder_1027bec98eb._service() line: not available
> $IPingHolder_1027bec98eb.getPing() line: not available
> $IPingHolder_1027bec98ea.getPing() line: not available
> de.compeople.spirit.communication.base.mikrokernel.objectprovider.WebServiceObjectProviderUsageTest.testBuildWebServiceWithoutTimeoutAndConstructorInjection() line: 39
> sun.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) line: not available [native method]
> sun.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 39
> sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) line: 25
> java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object...) line: 585
> de.compeople.spirit.communication.base.mikrokernel.objectprovider.WebServiceObjectProviderUsageTest(junit.framework.TestCase).runTest() line: 154
> de.compeople.spirit.communication.base.mikrokernel.objectprovider.WebServiceObjectProviderUsageTest(junit.framework.TestCase).runBare() line: 127
> junit.framework.TestResult$1.protect() line: 106
> junit.framework.TestResult.runProtected(junit.framework.Test, junit.framework.Protectable) line: 124
> junit.framework.TestResult.run(junit.framework.TestCase) line: 109
> de.compeople.spirit.communication.base.mikrokernel.objectprovider.WebServiceObjectProviderUsageTest(junit.framework.TestCase).run(junit.framework.TestResult) line: 118
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(java.lang.String[], java.lang.String) line: 598
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run() line: 354
> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(java.lang.String[]) line: 219
> As you can see the object provider is reached from two different points within BuilderFactoryLogic.instantiateExplicitConstructorInstance at line 132 and line 135 (marked with ===== in the stacktraces). Everything ´before´ is the same.
> Achim Huegen commented this:
> The reason is that BuilderFactoryLogic checks the provider value
> for compliance with the constructor parameter type, before assigning
> the value. For this check the current value is retrieved from the
> provider and after the check the value is retrieved again for assignment.
> That could be prevented by introducing some caching in
> BuilderPropertyFacet, but I'm not quite sure how this contradicts
> the dynamic nature of an object provider (that is the value could change
> over time).
> Hmmmhhh ... thinking longer about this I would even say it is quite
> dangerous not to cache the retrieved value.
> If the value changes during the construction process of a single
> service, the BuilderFactory will work with inconsistent data.
> Moreover the getFacetValue method is called quite often if multiple
> constructor candidates exists.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: hivemind-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: hivemind-dev-help@jakarta.apache.org