You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hivemind.apache.org by "Stefan Liebig (JIRA)" <hi...@jakarta.apache.org> on 2005/03/08 07:58:53 UTC

[jira] Created: (HIVEMIND-99) ObjectProvider.provideObject() called twice for a single request

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


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
-
If you want more information on JIRA, or have a bug to report 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


[jira] Closed: (HIVEMIND-99) ObjectProvider.provideObject() called twice for a single request

Posted by "Knut Wannheden (JIRA)" <hi...@jakarta.apache.org>.
     [ 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