Monday, November 4, 2013

URL Free Composite Code - Errors

We were trying to achieve URL free code in 11g composites, as this is standard thing to do in any programming language. We did consider all the options mentioned available as this, but anyways first thing is to make code URL free, so URL can be changed without doing any code deployment and code and binary is completely portable to any other environment - like jar or binary files.

For example, if ProcessA is calling ProcessB, we need to change reference of ProcessB.

ProcessA : composite.xml  

  <reference name="ProcessB" ui:wsdlLocation="PROCESS-B-ABSTRACT-WSDL">
    <interface.wsdl interface="http://xmlns.oracle.com/TokenTesting/ProjectB/BPELProcessB#wsdl.interface(BPELProcessB)"/>
    <binding.ws port="http://xmlns.oracle.com/TokenTesting/ProjectB/BPELProcessB#wsdl.endpoint(bpelprocessb_client_ep/BPELProcessB_pt)"
                location="PROCESS-B-RUNTIME-WSDL-WITH-BINDINGS" soapVersion="1.1">
        <property name="weblogic.wsee.wsat.transaction.flowOption" type="xs:string" many="false">WSDLDriven</property>
    </binding.ws>
  </reference>


Process A : componentType

  <reference name="ProcessB" ui:wsdlLocation="PROCESS-B-ABSTRACT-WSDL">
    <interface.wsdl interface="http://xmlns.oracle.com/TokenTesting/ProjectB/BPELProcessB#wsdl.interface(BPELProcessB)"/>
  </reference>

We decided to keep ProcessB runtime WSDL file along with bindings (which you can get from EM console) to MDS, so reference looked like this.

ProcessA : composite.xml 

  <reference name="ProcessB" ui:wsdlLocation="oramds:/apps/processb/processb.wsdl">
    <interface.wsdl interface="http://xmlns.oracle.com/TokenTesting/ProjectB/BPELProcessB#wsdl.interface(BPELProcessB)"/>
    <binding.ws port="http://xmlns.oracle.com/TokenTesting/ProjectB/BPELProcessB#wsdl.endpoint(bpelprocessb_client_ep/BPELProcessB_pt)"
                location="oramds:/apps/processb/processb.wsdl" soapVersion="1.1">
        <property name="weblogic.wsee.wsat.transaction.flowOption" type="xs:string" many="false">WSDLDriven</property>
    </binding.ws>
  </reference>


Process A : componentType
  <reference name="ProcessB" ui:wsdlLocation="oramds:/apps/processb/processb.wsdl">
    <interface.wsdl interface="http://xmlns.oracle.com/TokenTesting/ProjectB/BPELProcessB#wsdl.interface(BPELProcessB)"/>
  </reference>

Once that is done, you can either have valid runtime endpoint URL in , or dynamic endpoint URL by reading it from config file (for AIA it is OOTB but it can be done in pure SOA as well).


Errors
We faced different errors while working on this.

1. Null Pointer Exception:

Jdeveloper shows warning during compilation:

ProjectA\composite.xml:30: warning: Failed to Find Binding "ProcessB":
    "{http://xmlns.oracle.com/TokenTesting/ProjectB/BPELProcessB}BPELProcessB_pt" in WSDL Manager

While executing from EM, it shows following error:

java.lang.NullPointerException
        at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1058)
        at oracle.integration.platform.blocks.soap.AbstractWebServiceBindingComponent.dispatchRequest(AbstractWebServiceBindingComponent.java:521)
        at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.processOutboundMessage(WebServiceExternalBindingComponent.java:287)
        at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.sendSOAPMessage(WebServiceExternalBindingComponent.java:1191)
        at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.request(WebServiceExternalBindingComponent.java:785)
        at oracle.integration.platform.blocks.mesh.SynchronousMessageHandler.doRequest(SynchronousMessageHandler.java:139)
        at oracle.integration.platform.blocks.mesh.MessageRouter.request(MessageRouter.java:182)
        at oracle.integration.platform.blocks.mesh.MeshImpl.request(MeshImpl.java:190)
        at sun.reflect.GeneratedMethodAccessor3438.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at oracle.integration.platform.metrics.PhaseEventAspect.invoke(PhaseEventAspect.java:71)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy361.request(Unknown Source)
        at oracle.fabric.CubeServiceEngine.requestToMesh(CubeServiceEngine.java:858)
        at com.collaxa.cube.ws.WSInvocationManager.invoke(WSInvocationManager.java:267)
        at com.collaxa.cube.engine.ext.common.InvokeHandler.__invoke(InvokeHandler.java:1099)
        at com.collaxa.cube.engine.ext.common.InvokeHandler.handleNormalInvoke(InvokeHandler.java:594)
        at com.collaxa.cube.engine.ext.common.InvokeHandler.handle(InvokeHandler.java:132)
        at com.collaxa.cube.engine.ext.bpel.common.wmp.BPELInvokeWMP.__executeStatements(BPELInvokeWMP.java:74)
        at com.collaxa.cube.engine.ext.bpel.common.wmp.BaseBPELActivityWMP.perform(BaseBPELActivityWMP.java:173)
        at com.collaxa.cube.engine.CubeEngine.performActivity(CubeEngine.java:2718)
        at com.collaxa.cube.engine.CubeEngine._handleWorkItem(CubeEngine.java:1197)
        at com.collaxa.cube.engine.CubeEngine.handleWorkItem(CubeEngine.java:1100)
        at com.collaxa.cube.engine.dispatch.message.instance.PerformMessageHandler.handleLocal(PerformMessageHandler.java:76)
        at com.collaxa.cube.engine.dispatch.DispatchHelper.handleLocalMessage(DispatchHelper.java:251)
        at com.collaxa.cube.engine.dispatch.DispatchHelper.sendMemory(DispatchHelper.java:330)
        at com.collaxa.cube.engine.CubeEngine.endRequest(CubeEngine.java:4652)
        at com.collaxa.cube.engine.CubeEngine.endRequest(CubeEngine.java:4583)
        at com.collaxa.cube.engine.CubeEngine._createAndInvoke(CubeEngine.java:714)
        at com.collaxa.cube.engine.CubeEngine.createAndInvoke(CubeEngine.java:559)
        at com.collaxa.cube.engine.ejb.impl.CubeEngineBean.createAndInvoke(CubeEngineBean.java:103)
        at com.collaxa.cube.engine.ejb.impl.CubeEngineBean.syncCreateAndInvoke(CubeEngineBean.java:145)
        at com.collaxa.cube.engine.ejb.impl.bpel.BPELEngineBean.syncCreateAndInvoke(BPELEngineBean.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)

OR

java.lang.NullPointerException
        at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.getInvocationMetadata(WebServiceExternalBindingComponent.java:928)
        at oracle.integration.platform.blocks.soap.WebServiceExternalBindingComponent.request(WebServiceExternalBindingComponent.java:530)
        at oracle.integration.platform.blocks.mesh.SynchronousMessageHandler.doRequest(SynchronousMessageHandler.java:139)
        at oracle.integration.platform.blocks.mesh.MessageRouter.request(MessageRouter.java:179)
        at oracle.integration.platform.blocks.mesh.MeshImpl.request(MeshImpl.java:155)
        at sun.reflect.GeneratedMethodAccessor4746.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at oracle.integration.platform.metrics.PhaseEventAspect.invoke(PhaseEventAspect.java:71)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy348.request(Unknown Source)
        at oracle.fabric.CubeServiceEngine.requestToMesh(CubeServiceEngine.java:824)
        at com.collaxa.cube.ws.WSInvocationManager.invoke(WSInvocationManager.java:263)
        at com.collaxa.cube.engine.ext.common.InvokeHandler.__invoke(InvokeHandler.java:1056)
        at com.collaxa.cube.engine.ext.common.InvokeHandler.handleNormalInvoke(InvokeHandler.java:583)
        at com.collaxa.cube.engine.ext.common.InvokeHandler.handle(InvokeHandler.java:130)
        at com.collaxa.cube.engine.ext.bpel.common.wmp.BPELInvokeWMP.__executeStatements(BPELInvokeWMP.java:75)
        at com.collaxa.cube.engine.ext.bpel.common.wmp.BaseBPELActivityWMP.perform(BaseBPELActivityWMP.java:158)
        at com.collaxa.cube.engine.CubeEngine._performActivity(CubeEngine.java:2463)
        at com.collaxa.cube.engine.CubeEngine.performActivity(CubeEngine.java:2334)
        at com.collaxa.cube.engine.CubeEngine.handleWorkItem(CubeEngine.java:1116)
        at com.collaxa.cube.engine.dispatch.message.instance.PerformMessageHandler.handleLocal(PerformMessageHandler.java:73)
        at com.collaxa.cube.engine.dispatch.DispatchHelper.handleLocalMessage(DispatchHelper.java:220)
        at com.collaxa.cube.engine.dispatch.DispatchHelper.sendMemory(DispatchHelper.java:328)
        at com.collaxa.cube.engine.CubeEngine.endRequest(CubeEngine.java:4350)
        at com.collaxa.cube.engine.CubeEngine.endRequest(CubeEngine.java:4282)
        at com.collaxa.cube.engine.CubeEngine.createAndInvoke(CubeEngine.java:679)
        at com.collaxa.cube.engine.ejb.impl.CubeEngineBean.createAndInvoke(CubeEngineBean.java:103)
        at com.collaxa.cube.engine.ejb.impl.CubeEngineBean.syncCreateAndInvokeParticipate(CubeEngineBean.java:181)
        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 com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)

Solution: Make sure runtime WSDL is updated in referred in binding section. If it is abstract WSDL, it will throw this error message.


2. Transport can not be determined from uri REPLACE_WITH_ACTUAL_URL

oracle.fabric.common.FabricInvocationException: Unable to invoke endpoint URI "REPLACE_WITH_ACTUAL_URL" successfully 
due to: java.lang.IllegalArgumentException: Transport can not be determined from uri REPLACE_WITH_ACTUAL_URL    

Please make sure you have added soapVersion="XYZ" and weblogic.wsee.wsat.transaction.flowOption, which usually gets removed when you hand edit composite.xml or upgrade it from 10g to 11g.

  <reference name="ProcessB" ui:wsdlLocation="PROCESS-B-ABSTRACT-WSDL">
    <interface.wsdl interface="http://xmlns.oracle.com/TokenTesting/ProjectB/BPELProcessB#wsdl.interface(BPELProcessB)"/>
    <binding.ws port="http://xmlns.oracle.com/TokenTesting/ProjectB/BPELProcessB#wsdl.endpoint(bpelprocessb_client_ep/BPELProcessB_pt)"
                location="PROCESS-B-RUNTIME-WSDL-WITH-BINDINGS" soapVersion="1.1">
        <property name="weblogic.wsee.wsat.transaction.flowOption" type="xs:string" many="false">WSDLDriven</property>
    </binding.ws>
  </reference>



2 comments:

Adrian said...

for me I had to remove the
callbackInterface after migration from 10g.

<interface.wsdl callbackInterface="..."
interface="...

Chintan Shah said...

umm, ok. was it a sync process?