Configuración de la composición de las aplicaciones SIP
El estándar JSR 116 para aplicaciones SIP indica en la sección 2.4 que se pueden invocar varias aplicaciones para la misma solicitud SIP. El proceso de configurar aplicaciones para cumplir este estándar se denomina composición de aplicaciones.
Acerca de esta tarea
La composición de aplicaciones requiere que las implementaciones utilicen un modelo de servicios en cascada. El modelo de servicios en cascada requiere que las aplicaciones de servicio desencadenadas en el mismo host lo hagan en secuencia, como si el desencadenamiento sucediera en hosts distintos. Por lo tanto, las respuestas fluyen en sentido ascendente y llegan a las aplicaciones en orden inverso de las solicitudes correspondientes.
Para una solicitud de entrada inicial, el contenedor SIP prueba cada norma potencial por orden. Cuando el contenedor encuentra la enésima coincidencia, el contenedor invoca el servlet correspondiente.
Si el servlet debe transmitir al proxy la solicitud, el contenedor vuelve a explorar las normas para buscar coincidencias adicionales. Cuando el contenedor encuentra la (enésima+1) coincidencia, el contenedor invoca el servlet correspondiente.
Se excluye del proceso de coincidencia cualquier servlet de la misma aplicación que el servlet haya invocado anteriormente. No se puede invocar un servlet dos veces para la misma solicitud SIP.
Puede especificar la prioridad de inicialización durante el arranque. El valor de <load-on-startup> del archivo sip.xml define el orden en que se inicializan los servlets durante el arranque. Si este valor es menor que cero, los servlets se inicializarán cuando se encuentre la primera solicitud que coincida con ellos, según la norma de coincidencia y el orden de composición. Cero es un peso legítimo para el orden de inicialización de arranque. Si este código no existe o si contiene un valor negativo, el servlet no se inicializará durante el arranque.
También debe añadir <load-on-startup> al mismo código de web.xml si va a modificarlo manualmente. Es el contenedor Web el que carga los servlets (y siplets) y únicamente busca en web.xml. Cuando se despliega un archivo SAR, sólo se ha de modificarsip.xml. El archivo web.xml se crea automáticamente de forma correcta después del despliegue.
El código load-on-startup que se incorpora en el código del descriptor de despliegue SIP para un servlet dicta el orden en que se carga la aplicación cuando se arranca el servidor. No dicta el orden en que se llama a una aplicación cuando ésta es miembro de una cadena de composición de aplicaciones que coincide con las normas para procesar un nuevo mensaje de entrada.
El peso inicial de las aplicaciones y sus módulos se especifica en el archivo deployment.xml. El orden en que los módulos recogen las solicitudes de composiciones se evalúa en primer lugar mediante los pesos de las aplicaciones y, a continuación, mediante los pesos de los módulos. Los pasos siguientes se pueden completar en cualquier orden para especificar el peso de las aplicaciones o el peso de los módulos desde la consola administrativa.
Procedimiento
- Para especificar el peso de las aplicaciones (EAR), expanda y establezca el orden de arranque:
- Para especificar el peso de los módulos (WAR), expanda y establezca el peso de arranque.
- Reinicie las aplicaciones que ha modificado.
Ejemplo
sip.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sip-app
PUBLIC "-//Java Community Process//DTD SIP Application 1.0//EN"
"http://www.jcp.org/dtd/sip-app_1_0.dtd">
<sip-app>
<display-name>SIPSampleProxy</display-name>
<servlet>
<servlet-name>SIPSampleProxy</servlet-name>
<servlet-class>sipes.test.container.proxy.SIPSampleProxy</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SIPSampleProxy</servlet-name>
<pattern>
<equal>
<var>request.uri.user</var>
<value>SIPSampleProxy</value>
</equal>
</pattern>
</servlet-mapping>
<proxy-config>
<sequential-search-timeout>1000</sequential-search-timeout>
</proxy-config>
<session-config>
<session-timeout>12</session-timeout>
</session-config>
</sip-app>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp">
<display-name>SIPSampleProxy</display-name>
<servlet>
<servlet-name>SIPSampleProxy</servlet-name>
<display-name>SIPSampleProxy</display-name>
<servlet-class>sipes.test.container.proxy.SIPSampleProxy</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SIPSampleProxy</servlet-name>
<url-pattern>/SIPSampleProxy</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
El ejemplo siguiente es para un servidor autónomo.
deployment.xml
<?xml version="1.0" encoding="UTF-8" ?>
- <appdeployment:Deployment xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
xmlns:appdeployment="http://www.ibm.com/websphere/appserver/schemas/5.0/appdeployment.xmi"
xmi:id="Deployment_1137951186883">
- <deployedObject xmi:type="appdeployment:ApplicationDeployment" xmi:id="ApplicationDeployment_1137951186883"
deploymentId="0" startingWeight="1" binariesURL="$(APP_INSTALL_ROOT)/OrangeNode08Cell/SipContainerTestSuite.ear"
useMetadataFromBinaries="false" enableDistribution="true" createMBeansForResources="true" reloadEnabled="false"
appContextIDForSecurity="href:OrangeNode08Cell/SipContainerTestSuite"
filePermission=".*\.dll=755#.*\.so=755#.*\.a=755#.*\.sl=755" allowDispatchRemoteInclude="false"
allowServiceRemoteInclude="false">
<targetMappings xmi:id="DeploymentTargetMapping_1137951186883" enable="true" target="ServerTarget_1137951186883" />
<classloader xmi:id="Classloader_1137951186883" mode="PARENT_FIRST" />
- <modules xmi:type="appdeployment:WebModuleDeployment" xmi:id="WebModuleDeployment_1137951186883"
deploymentId="1" startingWeight="10000" uri="sipunit.war">
<targetMappings xmi:id="DeploymentTargetMapping_1137951186884" target="ServerTarget_1137951186883" />
<classloader xmi:id="Classloader_1137951186884" /> </modules>
<properties xmi:id="Property_1137951186883" name="validateinstall" value="warn" /> </deployedObject>
<deploymentTargets xmi:type="appdeployment:ServerTarget" xmi:id="ServerTarget_1137951186883"
name="server1" nodeName="OrangeNode10" /> </appdeployment:Deployment>