lunes, 29 de junio de 2015

MDS-00054: The file to be loaded does not exist.

Este es un error que se presenta típicamente cuando debido a que en nuestra infraestructura, se encuentra desplegado un compuesto corrupto.

En ocasiones, esto causa que nuestros servidores de SOA (soa_server) no inicien de manera correcta y se vayan a estado ADMIN.

Particularmente el planteamiento de la solución, es para la versión 11g. Sin embargo, continúo trabajando con 12c, por lo que puedo decir que la solución funciona también para esta versión.

El escenario es el siguiente:

Despliego un compuesto sin ningún problema. Por alguna razón, el compuesto se corrompe pero queda desplegado en la infraestructura de SOA. Al intentar levantar el servidor de SOA (soa_server) o re-desplegar el compuesto, se obtiene el siguiente error:

[12:18:51 PM] ----  Deployment started.  ----
[12:18:51 PM] Target platform is  (Weblogic 12.x).
[12:18:52 PM] Running dependency analysis...
[12:18:52 PM] Building...
[12:19:29 PM] Deploying profile...
[12:19:29 PM] Updating revision id for the SOA Project 'CompuestoCorrupto.jpr' to '1.0'..
[12:19:30 PM] Wrote Archive Module to C:\JDeveloper\mywork\12c\JDevSOA\OTMServices\CompuestoCorrupto\deploy\sca_CompuestoCorrupto_rev1.0.jar
[12:19:31 PM] Deploying sca_CompuestoCorrupto_rev1.0.jar to partition "default" on server soa_server2 [http://127.0.0.1:8001]
[12:19:31 PM] Processing sar=/C:/JDeveloper/mywork/12c/JDevSOA/OTMServices/CompuestoCorrupto/deploy/sca_CompuestoCorrupto_rev1.0.jar
[12:19:31 PM] Adding sar file - C:\JDeveloper\mywork\12c\JDevSOA\OTMServices\CompuestoCorrupto\deploy\sca_CompuestoCorrupto_rev1.0.jar
[12:19:31 PM] Preparing to send HTTP request for deployment
[12:19:31 PM] Creating HTTP connection to host:127.0.0.1, port:8001
[12:19:31 PM] Sending internal deployment descriptor
[12:19:31 PM] Sending archive - sca_CompuestoCorrupto_rev1.0.jar
[12:19:37 PM] Received HTTP response from the server, response code=500
[12:19:37 PM] Error deploying archive sca_CompuestoCorrupto_rev1.0.jar to partition "default" on server soa_server2 [http://127.0.0.1:8001]
[12:19:37 PM] HTTP error code returned [500]
[12:19:37 PM] Error message from server:
There was an error deploying the composite on soa_server2: oracle.fabric.common.FabricDeploymentException: oracle.fabric.common.FabricException: Error in getting XML input stream: oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml: oracle.mds.exception.MDSException: MDS-00054: The file to be loaded oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml does not exist.: Error in getting XML input stream: oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml: oracle.mds.exception.MDSException: MDS-00054: The file to be loaded oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml does not exist. {rootCauses=[]}: oracle.fabric.common.FabricException: Error in getting XML input stream: oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml: oracle.mds.exception.MDSException: MDS-00054: The file to be loaded oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml does not exist.: Error in getting XML input stream: oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml: oracle.mds.exception.MDSException: MDS-00054: The file to be loaded oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml does not exist..

[12:19:37 PM] Check server log for more details.
[12:19:37 PM] Error deploying archive sca_CompuestoCorrupto_rev1.0.jar to partition "default" on server soa_server2 [http://127.0.0.1:8001]
[12:19:37 PM] Deploying sca_CompuestoCorrupto_rev1.0.jar to partition "default" on server soa_server1 [http://127.0.0.1:8001]
[12:19:37 PM] Processing sar=/C:/JDeveloper/mywork/12c/JDevSOA/OTMServices/CompuestoCorrupto/deploy/sca_CompuestoCorrupto_rev1.0.jar
[12:19:37 PM] Adding sar file - C:\JDeveloper\mywork\12c\JDevSOA\OTMServices\CompuestoCorrupto\deploy\sca_CompuestoCorrupto_rev1.0.jar
[12:19:37 PM] Preparing to send HTTP request for deployment
[12:19:37 PM] Creating HTTP connection to host:127.0.0.1, port:8001
[12:19:37 PM] Sending internal deployment descriptor
[12:19:37 PM] Sending archive - sca_CompuestoCorrupto_rev1.0.jar
[12:19:45 PM] Received HTTP response from the server, response code=500
[12:19:45 PM] Error deploying archive sca_CompuestoCorrupto_rev1.0.jar to partition "default" on server soa_server1 [http://127.0.0.1:8001]
[12:19:45 PM] HTTP error code returned [500]
[12:19:45 PM] Error message from server:
There was an error deploying the composite on soa_server1: oracle.fabric.common.FabricDeploymentException: oracle.fabric.common.FabricException: Error in getting XML input stream: oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml: oracle.mds.exception.MDSException: MDS-00054: The file to be loaded oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml does not exist.: Error in getting XML input stream: oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml: oracle.mds.exception.MDSException: MDS-00054: The file to be loaded oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml does not exist. {rootCauses=[]}: oracle.fabric.common.FabricException: Error in getting XML input stream: oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml: oracle.mds.exception.MDSException: MDS-00054: The file to be loaded oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml does not exist.: Error in getting XML input stream: oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml: oracle.mds.exception.MDSException: MDS-00054: The file to be loaded oramds:/deployed-composites/CompuestoCorrupto_rev1.0/composite.xml does not exist..

[12:19:45 PM] Check server log for more details.
[12:19:45 PM] Error deploying archive sca_CompuestoCorrupto_rev1.0.jar to partition "default" on server soa_server1 [http://127.0.0.1:8001]
[12:19:45 PM] Deployment cancelled.
[12:19:45 PM] ----  Deployment incomplete  ----.
[12:19:46 PM] Error deploying archive file:/C:/JDeveloper/mywork/12c/JDevSOA/OTMServices/CompuestoCorrupto/deploy/sca_CompuestoCorrupto_rev1.0.jar
 (oracle.tip.tools.ide.fabric.deploy.common.SOARemoteDeployer)


Reiniciar el dominio, no es la solución, por si lo estaban considerando. Este compuesto ya quedó almacenado en el MDS y, además, está corrupto.

Afortunadamente existe una solución, documentada en My Oracle Support (Doc ID 1380835.1), que nos ayudará a solucionar el problema.

Lo primero que debe hacerse, es descargar una aplicación llamada ShareSOAInfraPartition. Esta aplicación está empaquetada en un archivo *.ear y se encuentra disponible en el siguiente enlace:

https://support.oracle.com/epmos/main/downloadattachmentprocessor?attachid=1380835.1%3AEARFILE&docType=HOWTO&action=download

Con ayuda de esta aplicación, vamos a eliminar el despliegue de la infraestructura SOA. Supongamos que la infraestructura está abajo, debido a que no podemos levantar los servidores de SOA por los compuestos corruptos. En este caso, haremos uso de WLST y de la aplicación que acabamos de descargar.

Ubicamos el comando, dentro de nuestro Middleware Home, para ejecutar WLST. Debería estar en la siguiente ruta:

$MIDDLEWARE_HOME/oracle_common/common/bin

Ejecutamos ./wlst.sh

Nos conectamos a nuestro servidor de administración, ejecutando el comando connect de WLST:

connect()

Nos va a pedir usuario, password y URL de conexión. La URL tiene la siguiente forma:

t3://172.17.100.69:7001

El siguiente paso es desplegar la aplicación que hemos descargado (
ShareSOAInfraPartition.ear). Esto lo vamos a hacer, también a través de WLST:

deploy('ShareSoaInfraPartition','ShareSoaInfraPartition.ear',upload='true')

Nota: El archivo ShareSoaInfraPartition.ear, se encuentra también debajo de la ruta donde estamos ejecutando WLST.

A continuación, haremos un export de los compuestos que están desplegados en nuestra infraestructura. Esta información se almacena en el MDS. El resultado del export será un archivo XML con la lista de los compuestos desplegados (incluyendo el compuesto corrupto). Esto lo vamos a hacer ejecutando el siguiente comando de WLST:

exportMetadata(application='ShareSoaInfraPartition',server='AdminServer',toLocation='/fmw11g/u01/tmp',docs='/deployed-composites/deployed-composites.xml')

El resultado de este comando dejará, debajo de la ruta /u01/tmp/deployed-composites, un archivo llamado deployed-composites.xml. Dentro de este archivo veremos algo como lo siguiente:

<?xml version='1.0' encoding='UTF-8'?>
<deployed-composites>
<composite-series name="default/Compuesto1" default="
default/Compuesto1!1.0">
<composite-revision dn="
default/Compuesto1!1.0" state="on" mode="active" location="dc/soa_a00a1072-58a3-4cfa-b66c-01b95c3a79d9">
<composite dn="
default/Compuesto1!1.0*soa_a00a1072-58a3-4cfa-b66c-01b95c3a79d9" scaEntityId="10099" deployedTime="2015-06-26T12:16:06.567-05:00"/>
</composite-revision>
</composite-series>
<composite-series name="default/Compuesto2" default="default/Compuesto2!1.0">
<composite-revision dn="
default/Compuesto2!1.0" state="on" mode="active" location="dc/soa_a00a1072-58a3-4cfa-b66c-01b95c3a79d9">
<composite dn="
default/Compuesto2!1.0*soa_a00a1072-58a3-4cfa-b66c-01b95c3a79d9" scaEntityId="10099" deployedTime="2015-06-26T12:16:06.567-05:00"/>
</composite-revision>
</composite-series>

<composite-series name="default/CompuestoCorrupto" default="default/CompuestoCorrupto!1.0">
<composite-revision dn="
default/CompuestoCorrupto!1.0" state="on" mode="active" location="dc/soa_a00a1072-58a3-4cfa-b66c-01b95c3a79d9">
<composite dn="
default/CompuestoCorrupto!1.0*soa_a00a1072-58a3-4cfa-b66c-01b95c3a79d9" scaEntityId="10099" deployedTime="2015-06-26T12:16:06.567-05:00"/>
</composite-revision>
</composite-series>

</deployed-composites> 

Lo siguiente es eliminar el compuesto corrupto del XML (marcado en rojo), guardar y hacer un import de ese nuevo archivo XML al MDS.

El import, al igual que el export que hicimos, se realiza a través del siguiente comando de WLST:

importMetadata(application='ShareSoaInfraPartition',server='AdminServer',fromLocation='/u01/tmp',docs='/deployed-composites/deployed-composites.xml')

Una vez concluído el import, reiniciamos el servidor de SOA (soa_server) y el compuesto ya no se encontrará desplegado. Si intentamos nuevamente el despliegue, este es el resultado:

[01:37:07 PM] ----  Deployment started.  ----
[01:37:07 PM] Target platform is  (Weblogic 12.x).
[01:37:07 PM] Running dependency analysis...
[01:37:07 PM] Building...
[01:37:44 PM] Deploying profile...
[01:37:44 PM] Wrote Archive Module to C:\JDeveloper\mywork\12c\JDevSOA\OTMServices\CompuestoCorrupto\deploy\sca_CompuestoCorrupto_rev1.0.jar
[01:37:45 PM] Deploying sca_CompuestoCorrupto_rev1.0.jar to partition "default" on server soa_server2 [http://127.0.0.1:8001]
[01:37:45 PM] Processing sar=/C:/JDeveloper/mywork/Comex/12c/JDevSOA/OTMServices/CompuestoCorrupto/deploy/sca_CompuestoCorrupto_rev1.0.jar
[01:37:45 PM] Adding sar file - C:\JDeveloper\mywork\12c\JDevSOA\OTMServices\CompuestoCorrupto\deploy\sca_CompuestoCorrupto_rev1.0.jar
[01:37:45 PM] Preparing to send HTTP request for deployment
[01:37:45 PM] Creating HTTP connection to host:127.0.0.1, port:8001
[01:37:45 PM] Sending internal deployment descriptor
[01:37:45 PM] Sending archive - sca_CompuestoCorrupto_rev1.0.jar
[01:37:52 PM] Received HTTP response from the server, response code=200
[01:37:52 PM] Successfully deployed archive sca_CompuestoCorrupto_rev1.0.jar with 0 warning/severe messages to partition "default" on server soa_server2 [http://127.0.0.1:8001]
[01:37:52 PM] Elapsed time for deployment:  46 seconds
[01:37:52 PM] ----  Deployment finished.  ----


Es todo, tendremos nuestro compuesto desplegado nuevamente. O bien, nuestros servidores de SOA levantarán sin problema alguno.

jueves, 25 de junio de 2015

Error: Unable to find suitable inbound binding.

Estoy participando en un proyecto de migración a la versión 12c de Oracle SOA Suite.

Existen algunos servicios de integración con OTM (Oracle Transportation Management) que se requiere migrar de la versión 10g a 12c.

El requerimiento es NO MODIFICAR estos servicios, debido a que son BPEL proporcionados por Oracle para la integración con OTM. Por lo que sólo los migré.

El procedimiento de migración fue el natural: 10g > 11g > 12c. Tomando en cuenta que de 10g hay que migrar por lo menos a la versión 11.1.1.7, para posteriormente poder saltar a 12c.

La explicación anterior, es para hacer notar que si dejamos que JDeveloper haga el trabajo de migración de los proyectos, podría ser obvio que no deberíamos tener problemas al compilar y desplegar estos servicios. Esto no sucede así de fácil. Si bien es cierto que JDeveloper se encarga de hacer la actualización de los proyectos a la versión 12c, no todo es color de rosa.

Al compilar, no hay ningún problema:

Buildfile: C:\Oracle\Middleware\JDev12c\soa\bin\ant-sca-compile.xml

BUILD SUCCESSFUL
Total time: 35 seconds



Sin embargo, al intentar desplegar (previa configuración en WebLogic de los recursos necesarios: data sources, jndi, etc), me encuentro con el siguiente error:

[12:19:02 PM] Error deploying archive sca_*_rev1.0.jar to partition "default" on server soa_server2 [http://127.0.0.1:8001]
[12:19:02 PM] HTTP error code returned [500]
[12:19:02 PM] Error message from server:
There was an error deploying the composite on soa_server2: Operation failed - Member(Id=1, Timestamp=2015-06-23 17:32:54.86, Address=127.0.0.1:50000, MachineId=54452, Location=site:,machine:SOAMachine1,process:16139,member:soa_server1, Role=WeblogicServer):[JCABinding] [*.WshInboundInterface/1.0]Unable to complete load due to: Generic error.
JCA binding runtime error.
Cause: Unable to find suitable inbound binding.
Please inspect the diagnostic log to determine the reason, and if possible take corrective action.
: Generic error.
JCA binding runtime error.
Cause: Unable to find suitable inbound binding.
Please inspect the diagnostic log to determine the reason, and if possible take corrective action.
; .  Please see the server diagnostic logs on soa_server2 for details.

[12:19:02 PM] Check server log for more details.
[12:19:02 PM] Error deploying archive sca_*_rev1.0.jar to partition "default" on server soa_server2 [http://127.0.0.1:8001] 



La recomendación es verificar el log de diagnóstico de los servidores de SOA. Para determinar la causa del error y poder dar una solución al problema en el despliegue.

En el log de diagnóstico me encuentro con lo siguiente:

[2015-06-25T11:41:44.257-05:00] [soa_server1] [ERROR] [SOA-21537] [oracle.integration.platform.blocks.deploy.servlet] [tid: [ACTIVE].Ex
ecuteThread: '4' for queue: 'weblogic.kernel.Default (self-tuning)'] [userId: weblogic] [ecid: 05a819cc-4238-4247-8353-10636defefa8-000
3b4e4,0] [APP: soa-infra] [DSID: 0000Ksfa8zgFw000jzwkno1LYTuJ000006] Sending back error message: There was an error deploying the compo
site on soa_server1: Operation failed - Member(Id=1, Timestamp=2015-06-23 17:32:54.86, Address=172.17.100.69:50000, MachineId=54452, Lo
cation=site:,machine:SOAMAchine1,process:16139,member:soa_server1, Role=WeblogicServer):[JCABinding] [WshReceivePShipmentFromOtm.WshIn
boundInterface/1.0
]Unable to complete load due to: Generic error.[[
JCA binding runtime error.
Cause: Unable to find suitable inbound binding.
Please inspect the diagnostic log to determine the reason, and if possible take corrective action.
: Generic error.
JCA binding runtime error.
Cause: Unable to find suitable inbound binding.


Lo que realmente está sucediendo, es que el servidor no está logrando resolver una interface de un WSDL del proyecto.

Revisando el composite generado en 12c (en 10g no existía composite), me doy cuenta que tengo únicamente servicios síncronos involucrados en la integración. Sin embargo, en el código del composite, dentro de las referencias, me encuentro con lo siguiente:

<reference ui:wsdlLocation="WshOtmInboundGrp.wsdl" name="WshInboundInterface">
    <!--interface.wsdl callbackInterface="http://xmlns.oracle.com/pcbpel/adapter/db/WshOtmInboundGrp/#wsdl.interface(WshOtmInboundGrp_ptt)"
        interface="http://xmlns.oracle.com/pcbpel/adapter/db/WshOtmInboundGrp/#wsdl.interface(WshOtmInboundGrp_ptt)"/-->

    <interface.wsdl interface="http://xmlns.oracle.com/pcbpel/adapter/db/WshOtmInboundGrp/#wsdl.interface(WshOtmInboundGrp_ptt)"/>
</reference>


La parte marcada en rojo, es el código originalmente generado por JDeveloper después de realizar el proceso de migración. La parte marcada en verde, es la solución al problema para que el proyecto despliegue correctamente.

Resulta que, por alguna razón desconocida para mi, JDeveloper coloca una interface de callback de forma automática en las referencias del compuesto. A pesar de que los servicios involucrados son todos síncronos. Es decir, no existe un puerto para propósitos de callback definido en ninguno de los WSDL del proyecto. Por esta razón, el servidor no identifica esta interface como una interface de callback y todo resulta en un error al desplegar.

Una vez corregidas todas las referencias del composite, eliminando únicamente el callbackinterface, intentamos desplegar nuevamente el proyecto:

[12:11:06 PM] Creating HTTP connection to host:127.0.0.1, port:8001
[12:11:06 PM] Sending internal deployment descriptor
[12:11:06 PM] Sending archive - sca_*_rev1.0.jar
[12:11:13 PM] Received HTTP response from the server, response code=200
[12:11:13 PM] Successfully deployed archive sca_*_rev1.0.jar with 0 warning/severe messages to partition "default" on server soa_server2 [http://127.0.0.1:8001]
[12:11:14 PM] Elapsed time for deployment:  55 seconds
[12:11:14 PM] ----  Deployment finished.  ----


Espero que les sea de utilidad.