Red5 的配置可以是 web.xml 中的几个上下文参数,一个上下文文件,一个 bean 的 ref 文件,也可以是一个 Spring 为每个应用的上下文文件。仅仅使用 AMF 与 Red5 进行沟通的 Web 应用不需要服务应用上下文里的配置项。根据 Web 应用类加载器的工作方式,由 Spring 管理的应用上下文只适用于包含在根 war 里的应用。此外,Red5 使用一个叫做域的上下文副本,域用作上下文、处理程序、服务核心实例和一些其他对象的容器。域类似于 FMS 中的程序模型。初始入口点或为 Red5 启动 servlet 的是 WarLoaderServlet,它像以下所示作为一个 servlet 监听器被定义在 web.xml。幸运的是这个 servlet 取代了一个标准的 Red5 服务里的独立的类。
<listener> <listener-class>org.red5.server.war.WarLoaderServlet</listener-class> </listener>
默认上下文通过 parentContextKey 参数在 web.xml 进行指定:
<context-param> <param-name>parentContextKey</param-name> <param-value>default.context</param-value> </context-param>
对应于全局上下文的域是全局域,它是由 web.xml 通过 globalScope 参数进行指定的:
<context-param> <param-name>globalScope</param-name> <param-value>default</param-value> </context-param>
Web 上下文的定义(文件)是 Spring 配置文件中使用 -web.xml 后缀指定的。如果你的应用名为 oflaDemo 那么它的配置文件将被命名为 oflaDemo-web.xml。不要把 Spring web 上下文文件和 J2EE 上下文描述符混淆了,Spring web 上下文文件仅仅用于 Red5 web 上下文,之后才被 Tomcat 所用。每个 web 上下文都必须具有一个相应的配置文件,这些配置文件使用 ant- 格式的参数在 web.xml 中进行配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/classes/*-web.xml</param-value> </context-param>
* 上下文 - 每个上下文必须分给一个唯一的名字,因为所有的上下文都存在于一个单独的 Spring 应用上下文里。根 web 上下文命名为 web.context,额外上下文在此基础上使用其 web 应用名进行加缀。比如 oflaDemo 将会被命名为 web.context.oflaDemo。一个定义在 web 上下文文件里的上下文可以像下面这样配置:
<bean id="web.context" class="org.red5.server.Context"> <property name="scopeResolver" ref="red5.scopeResolver" /> <property name="clientRegistry" ref="global.clientRegistry" /> <property name="serviceInvoker" ref="global.serviceInvoker" /> <property name="mappingStrategy" ref="global.mappingStrategy" /> </bean>
根域的定义类似于此:
<bean id="web.scope" class="org.red5.server.WebScope" init-method="register"> <property name="server" ref="red5.server" /> <property name="parent" ref="global.scope" /> <property name="context" ref="web.context" /> <property name="handler" ref="global.handler" /> <property name="contextPath" value="/" /> <property name="virtualHosts" value="*,localhost, localhost:8080" /> </bean>
* 处理程序 - 每个上下文需要一个域来提供连接对象调用的方法。所有的处理程序都要实现 org.red5.server.api.IScopeHandler,但你也可以实现附加接口对共享对象和实时流的访问进行控制。org.red5.server.adapter.ApplicationAdapter 是一个由 Red5 提供的实现例子,它可以用作你的基类。关于这个类的附加详细介绍请参阅其文档。oflaDemo 的域处理程序应用示例:
<bean id="web.handler.oflaDemo" class="org.red5.server.webapp.oflaDemo.Application"/>
id 属性由 oflaDemo 域的定义引用到:
<bean id="web.scope.oflaDemo" class="org.red5.server.WebScope" init- method="register"> <property name="server" ref="red5.server" /> <property name="parent" ref="global.scope" /> <property name="context" ref="web.context.oflaDemo" /> <property name="handler" ref="web.handler.oflaDemo" /> <property name="contextPath" value="/oflaDemo" /> <property name="virtualHosts" value="*,localhost, localhost:8080" /> </bean>
如果你并不需要一些特殊的服务端的逻辑处理,你可以使用由 Red5 提供的默认处理程序:
<bean id="web.handler" class="org.red5.server.adapter.ApplicationAdapter" />
附加应用指的是访问 Red5 的 ROOT web 应用之外的 web 应用。无论这些应用是否共存于同一个 JVM 实例,它们仅仅通过 RTMP 或者 AMF 隧道 servlet 访问 Red5。隧道 servlet 用于每个需要和 Red5 进行 AMF 交流的应用,配置在 web.xml 中,举例如下:
<servlet> <servlet-name>gateway</servlet-name> <servlet-class>org.red5.server.net.servlet.AMFTunnelServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>gateway</servlet-name> <url-pattern></servlet-mapping> </servlet-mapping>
隧道 servlet 类必须在应用执行的 classpath 中。除了隧道 servlet 之外 org.red5.server.net.servlet.ServletUtils 类也是必须的,连同以下库 jar:
commons-codec-1.3.jar commons-httpclient-3.0.1.jar commons-logging-1.1.jar log4j-1.2.14.jar mina-core-1.1.2.jar
这些 jar 应该放在你的应用的 WEB-INF/lib 目录下,例如:
C:\Tomcat-6.0.14\webapps\myapp\WEB-INF\lib
log4j - logging 配置文件和 Spring logging 启动 servlet 的路径如下所示。这些应该定义在 war 加载器 servlet 之前,这样子 logging 就可以在 Red5 加载之前初始化了。
<context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
AMF gateway - 这个 servlet 提供了和服务器应用交互所用的 AMF。
<servlet> <servlet-name>gateway</servlet-name> <servlet-class>org.red5.server.net.servlet.AMFGatewayServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>gateway</servlet-name> <url-pattern>/gateway</url-pattern> </servlet-mapping>
RTMPT - 这个 servlet 实现了通过 HTTP 隧道的 RTMP,这是通常用来绕过防火墙的问题。
<servlet> <servlet-name>rtmpt</servlet-name> <servlet-class>org.red5.server.net.rtmpt.RTMPTServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>rtmpt</servlet-name> <url-pattern>/open/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>rtmpt</servlet-name> <url-pattern>/idle/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>rtmpt</servlet-name> <url-pattern>/send/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>rtmpt</servlet-name> <url-pattern>/close/*</url-pattern> </servlet-mapping>
Security - 以下定义用于防止敏感信息的检索。
<security-constraint> <web-resource-collection> <web-resource-name>Forbidden</web-resource-name> <url-pattern>/WEB-INF/*</url-pattern> </web-resource-collection> <auth-constraint /> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>Forbidden</web-resource-name> <url-pattern>/persistence/*</url-pattern> </web-resource-collection> <auth-constraint /> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>Forbidden</web-resource-name> <url-pattern>/streams/*</url-pattern> </web-resource-collection> <auth-constraint /> </security-constraint>
2. 找到你的 Tomcat 安装目录。
C:\Program Files\Apache\Tomcat
3. 删除 work 目录。
C:\Program Files\Apache\Tomcat\work
4. 删除 conf 目录下的 Catalina 目录。
C:\Program Files\Apache\Tomcat\conf\Catalina
5. 删除扩展的 war 目录,如果有的话。
C:\Program Files\Apache\Tomcat\webapps\ROOT C:\Program Files\Apache\Tomcat\webapps\echo C:\Program Files\Apache\Tomcat\webapps\SOSample
6. 请确认你的 WAR 文件放到了 webapps 目录下。
C:\Program Files\Apache\Tomcat\webapps\ROOT.war C:\Program Files\Apache\Tomcat\webapps\echo.war C:\Program Files\Apache\Tomcat\webapps\SOSample.war