2009年8月13日 星期四

如何在 Red 5 上建立一個應用程序

這份說明的原始文件可以在 Red5 安裝目錄下的 Doc 目錄內找到,檔名為 HOWTO-NewApplications.txt,下面內容說不上翻譯,只是我的一點心得,如果你對內容有疑義,建議還是參考原文。

Red5 將所有定義應用程序的配置文件固定放置在根目錄下(在 linux 下,這個根目錄通常指的是 dist )的 webapps 目錄內,因此,在建立一個新的應用程序前,你必須先在 webapps 目錄下新建一個子資料夾,名稱通常就是你的 project 名稱,然後在它之下再建立一個子資料夾,你必須將這個資料夾命名為 "WEB-INF",然後將配置文件及需要用到的類別 ( Class )放進這個資料夾內,配置文件並不用重頭開始建立,在 /doc/templates/myapp 目錄下有提供一個 "WEB-INF" 範本,直接拷貝過來即可。

打開這個目錄看一下,共有四個檔案:
  • log4j.properties
  • red5-web.properties
  • red5-web.xml
  • web.xml
它們的檔案內容如下:

log4j.properties
# logging config, this should be auto reloaded by spring.
red5-web.properties
webapp.contextPath=/myapp
webapp.virtualHosts=localhost, 127.0.0.1
這個檔是將 red5-web.xml 中的 contextPath 和 virtualHosts 屬性另外移出建立的檔案。

裡面的 "contextPath" 會被視為作用域的根 ( root ),當你需要動態建立擴充作用域時,就可以在這個路徑後增加新的元素,這個擴充作用域將和原來的作用域共用一個控制器,但是擁有自己獨立的屬性、shared objects 和 live streams

red5-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 <property name="location" value="/WEB-INF/red5-web.properties" />
</bean>

<bean id="web.context" class="org.red5.server.Context" autowire="byType" />

<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="web.handler" />
 <property name="contextPath" value="${webapp.contextPath}" />
 <property name="virtualHosts" value="${webapp.virtualHosts}" />
</bean>

<bean id="web.handler" class="the.path.to.my.Application" singleton="true" />

<!-- this will support calling methods through "myhandler.<methodName>" -->
<bean id="myhandler.service" class="the.path.to.my.ServiceHandler" singleton="true" />
</beans>
每一個配置檔都至少包括以下三種 Bean:
1.Context
這個 bean 的預留名稱為 "web.context" 它的作用是將路徑映射到作用域中,查詢服務和控制器,預設的類別為 "org.red5.server.Context",在每一個應用程序只能有一個 Context,但是這個 Context 可以分享至多個作用域。
2.Scopes
每一個應用程序至少有一個可以將控制器連接到 Context 和 Server 的作用域,它的作用是用來建造一個樹狀結構,客戶端能夠連接到這個樹狀結構上的任何一個結點及分享物件 ( 例如 shared objects 或是 live streams ),你可以將作用域看成是一間房間或是一個實例。
作用域的預設名稱為 "web.scope",你可以隨意的更改,它擁有以下屬性:
  • server
    設置全體的伺服器作用域為 "red5.server"
  • parent
    設置父作用域,通常為 "global.scope"
  • context指目前作用域,使用 "web.context"
  • handler
    目前作用域的控制器
  • contextPath
    連接目前作用域的路徑
  • virtualHosts
    以逗號分開執行中的作用域的主機名稱或 IP 地址
你可以將 "contextPath" 和 "virtualHosts" 屬性的值移到另一個單獨的 properties 檔中 ( 如本例 ),然後以參數的形式表示,如果要這麼做的話,就需要設置另一個 Bean "placeholderConfig"

3.Handlers
每一個 context 都需要一個控制器,它實現一個當客戶端連接一個作用域時觸發的方法,這個控制器的界面是 "org.red5.server.api.IScopeHandler",當然,你也可以實現其它的界面去控制存取 shared objects 或 streams

一個最簡單的實現例子,就是可以在類別庫中找到的基礎類別"org.red5.server.adapter.ApplicationAdapter",詳情可以參考 javadoc 文件
如果你不需要使用任何伺服端技術(asp.net、php、J2EE...)的話,你可以使用 Red5 提供的預設應用程序控制器:
<bean id="web.handler"
 class="org.red5.server.adapter.ApplicationAdapter"
 singleton="true" />

web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 
 xmlns="http://java.sun.com/xml/ns/j2ee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
 version="2.4">

<display-name>My sample Red5 application</display-name>

<context-param>
 <param-name>globalScope</param-name>
 <param-value>default</param-value>
;</context-param>

<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/red5-*.xml</param-value>
</context-param>

<context-param>
 <param-name>locatorFactorySelector</param-name>
 <param-value>red5.xml</param-value>
</context-param>

<context-param>
 <param-name>parentContextKey</param-name>
 <param-value>default.context</param-value>
</context-param>

#這個區塊把它刪除掉
<context-param>
 <param-name>log4jConfigLocation</param-name>
 <param-value>/WEB-INF/log4j.properties</param-value>
</context-param>

<context-param>
 <param-name>webAppRootKey</param-name>
 <param-value>/myapp</param-value>
</context-param>

#這個區塊把它刪除掉
<listener>
 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- remove the following servlet tags if you want to disable remoting for this application -->
<servlet>
 <servlet-name>gateway</servlet-name>
 <servlet-class>org.red5.server.net.servlet.AMFGatewayServlet</servlet-class>
</servlet>

<servlet-mapping>
 <servlet-name>gateway</servlet-name>
 <url-pattern>/gateway</url-pattern>
</servlet-mapping>

<security-constraint>
 <web-resource-collection>
  <web-resource-name>Forbidden</web-resource-name>
  <url-pattern>/streams/*</url-pattern>
 </web-resource-collection>
 <auth-constraint/>
</security-constraint>
</web-app>

web.xml 是最主要的配置檔,它包括以下參數:
  • globalScope
    全作用域名稱,保持預設值即可
  • contextConfigLocation
    定義這個應用程序使用的配置檔的檔名,這些配置檔列出應用程序連接 / 掛斷客戶端的類別 ( class ),同時也提供客戶端可以調用方法的類別
  • locatorFactorySelector
    指定應用程序上下文配置文件的檔名,通常是使用 "red5.xml"
  • parentContextKey
    父上下文的名字,通常是 "default.context"
  • log4jConfigLocation
    指定 log 子系統的路徑
  • webAppRootKey
    指定此應用程序的識別名稱
另外,灰色區塊要把它刪除掉,詳情請看 Red5 HTTP ERROR: 404 一文

一個簡單的範例,用幾行程式來建立一個控制器
package the.path.to.my;
import org.red5.server.adapter.ApplicationAdapter;
    public class Application extends ApplicationAdapter {
     public Double add(Double a, Double b){
     return a + b;
 }
}

用 Eclipse 或其它編譯器編譯之後,在 WEB-INF 目錄下建立一個目錄,名稱為 classes,將編譯過的輸出類別放進這個目錄即可。

經過以上的配置後,你就可以使用 ActionScript 來呼叫這個方法:
nc = new NetConnection();
nc.connect("rtmp://localhost/myapp");
nc.onResult = function(obj){
 trace("The result is " + obj);
}
nc.call("add", nc, 1, 2);

輸出的結果如下:
The result is 3

沒有留言:

張貼留言