设置 SIP 应用程序组合
在 2.4 节中,SIP 应用程序的 JSR 116 标准指出可对同一 SIP 请求调用多个应用程序。设置应用程序以符合此标准的过程称为应用程序组合。
关于此任务
应用程序组合要求实现过程使用一个层叠服务模型。该层叠服务模型要求在同一主机上触发的服务应用程序按顺序进行触发,如同在不同主机上执行触发操作。因此,响应按上行方向流动并按所对应请求的相反顺序来命中应用程序。
对于初始入局请求,SIP 容器将按顺序尝试每个潜在规则。在查找第 n 个匹配项时,容器将调用对应的 Servlet。
如果 Servlet 必须代理该请求,那么容器将重新扫描规则以搜索其他匹配项。在查找第 n+1 个匹配项时,容器将调用对应的 Servlet。
任何 Servlet 只要与先前调用的 Servlet 在同一应用程序中,均排除在匹配过程之外。不会对同一 SIP 请求调用两次 Servlet。
可指定“启动时装入优先级”。sip.xml 中的 <load-on-startup> 定义在启动时初始化 Servlet 的顺序。如果此值小于零,那么在第一个请求按照匹配规则和组合顺序匹配至某些 Servlet 时,就会对这些 Servlet 进行初始化。零是启动初始化顺序的合理权重。如果此标记不存在或者包含负值,那么在启动时将不会初始化该 Servlet。
此外,如果要手工更改 web.xml,那么还应该将 <load-on-startup> 添加至 web.xml 的同一标记中。Servlet(和 siplet)是由 WebContainer 装入的,并且该 WebContainer 将仅查看 web.xml。在部署 SAR 时,只需更改 sip.xml。在部署后将自动正确构造 web.xml。
load-on-startup 标记嵌入在 Servlet 的 SIP 部署描述符标记中,指示服务器启动时装入应用程序的顺序。如果应用程序是应用程序组合链(匹配规则以处理新的入局消息)的成员,那么该标记不指示应用程序的调用顺序。
应用程序及其模块的启动权重在 deployment.xml 文件中进行指定。进行组合时,模块捡取请求的顺序是根据应用程序权重,然后根据模块权重来计算的。要从管理控制台指定应用程序权重或模块权重,可按任何顺序完成以下步骤。
过程
- 要指定应用程序 (EAR) 权重,请展开 并设置启动顺序。
- 要指定模块 (WAR) 权重,请展开 ,然后设置启动权重。
- 重新启动更改的应用程序。
示例
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>
以下示例适用于独立服务器。
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>