ひよっこ。

I want to…

GoogleAppEngineでBlazeDS環境を構築してみた

Posted by hikaruworld : 2009 5月 17

基本的には、下記に書いてある参考サイト通り作業した。
特にAppEngine & Adobe BlazeDS (fix)のそのまんまに近い

参考になったサイトは以下。多謝!!

以下は、GAEでアップデートした実際のサンプルサイト
flexblazeds.appspot.com

はじめに

まず、参考サイトにもあるようにmessagingは動かないらしい。
動くのはremotingのみ(自分では未確認)。

また、GAE及びBlazeDSのバグでそのまま利用するだけでは正常に動作しないとのこと。
ライブラリの置き換えと、BlazeDSのソースを修正してjar化する必要がある。

また、これらの構築作業はすべてのパラメータを理解してやっている訳ではない。
BlazeDSのソースの修正なども同様。
後で詳細を確認して検証したいと思っているが、基本的にはやっぱり自己責任でー。

構築環境

OS MacOSX 10.5.6
IDE Eclipse 3.4.0(GooglePluginForEclipse v1.0.1)
ライブラリ Blazeds3.2.0.3978
SDK GAE SDK1.2.0 (実装中にGAE1.2.1にupdateしたが、基本的には1.2.0で作業)
Java1.6.0(Java1.5ではエラーになる。詳細は後述。)
FlexBuilder 3.2.0
ブラウザ Firefox3.0.10

作業内容

以下、実際の作業手順。
※前提として、GooglePluginのEclipseへのインストール、及びBlazeDS+Flexプロジェクトの設定周りなどは省略。
BlazeDSの最小構成に関しては、この辺りを参考に適当に構築した。

概要

ざっと手順を書くと以下の通り
1. Javaのコンパイラを1.6に切り替え
2. appengine-web.xmlにtrueを設定
3. xalanをlibに配置
4. service-config.xmlをfalse に設定
5. BlazeDSのソースを修正(AbstractAmfInput.java, BaseHTTPEndpoint.java)し、再ビルド後に再配置。

プロジェクト構成及びソース

# tree ./preproegg
./preproegg/
|-- src
|   |-- META-INF
|   |   `-- jdoconfig.xml
|   |-- com ---- 実際のソースディレクトリ
|   |   `-- wordpress
|   |       `-- prepro
|   |           `-- remote
|   |               `-- HelloWorld.java --- RemoteObjectで利用されるクラス
|   `-- log4j.properties
`-- war
    |-- WEB-INF
    |   |-- appengine-web.xml
    |   |-- classes
    |   |   |-- META-INF
    |   |   |   `-- jdoconfig.xml
    |   |   |-- com
    |   |   |   `-- wordpress
    |   |   |       `-- prepro
    |   |   |           `-- remote
    |   |   |               `-- HelloWorld.class
    |   |   `-- log4j.properties
    |   |-- flex
    |   |   `-- services-config.xml
    |   |-- lib
    |   |   |-- appengine-api-1.0-sdk-1.2.0.jar
    |   |   |-- backport-util-concurrent.jar
    |   |   |-- datanucleus-appengine-1.0.0.final.jar
    |   |   |-- datanucleus-core-1.1.0.jar
    |   |   |-- datanucleus-jpa-1.1.0.jar
    |   |   |-- flex-messaging-common.jar
    |   |   |-- flex-messaging-core.jar
    |   |   |-- flex-messaging-remoting.jar
    |   |   |-- geronimo-jpa_3.0_spec-1.1.1.jar
    |   |   |-- geronimo-jta_1.1_spec-1.1.1.jar
    |   |   |-- jdo2-api-2.3-SNAPSHOT.jar
    |   |   `-- xalan.jar
    |   |-- logging.properties
    |   `-- web.xml
    |-- hello-debug ---- Flexの出力ディレクトリ
    |   |-- AC_OETags.js
    |   |-- hello.html
    |   |-- hello.swf
    |   |-- history
    |   |   |-- history.css
    |   |   |-- history.js
    |   |   `-- historyFrame.html
    |   `-- playerProductInstall.swf
    `-- index.html

構築手順

以下が、実際の手順。試行錯誤の結果も混じっていますので無駄な事もしている。備忘録的に記述。
基本的には、参考サイトの手順にのっとって行えば問題ない。

1. Javaのコンパイラを1.6に切り替え

とりあえず、作成したサンプルをローカルで動作確認(Runで起動)。
画面に遷移すると以下のようなエラーが出た。

HTTP ERROR: 500

INTERNAL_SERVER_ERROR
RequestURI=/hello-debug/hello.html

Caused by:

java.lang.NullPointerException
	at com.google.appengine.tools.development.LocalResourceFileServlet.doGet(LocalResourceFileServlet.java:139)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
	at org.mortbay.jetty.Server.handle(Server.java:313)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
	at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)

この辺Issue 1218と同件?
Javaのバージョンが旧かったようなので、最新版の1.6系にコンパイラを変更して再度確認を行う。
(そういえばMacOSXのデフォルト設定ではJavaは1.5系だったけか。)

再確認して問題ない事を確認。
というわけで、早速サーバにUPLOADして起動確認。ちなみにendpointの設定は修正済み。

2. appengine-web.xmlにtrueを設定

アップロードした内容の動作確認したが反応がない。GAE側のログを確認。

WARNING: /messagebroker/amf
java.lang.RuntimeException: Session support is not enabled in appengine-web.xml.  To enable sessions, put <sessions-enabled>true</sessions-enabled> in that file.  Without it, getSession() is allowed, but manipulation of sessionattributes is not.
	at com.google.apphosting.utils.jetty.StubSessionManager$StubSession.throwException(StubSessionManager.java:67)
	at com.google.apphosting.utils.jetty.StubSessionManager$StubSession.setAttribute(StubSessionManager.java:63)
	at flex.messaging.HttpFlexSession.getFlexSession(HttpFlexSession.java:236)
	at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:257)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
	at org.mortbay.jetty.Server.handle(Server.java:313)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
	at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)

セッション設定が有効になっていないと言われているので、仰せのままに従って、appengine-web.xmlに以下を追記した。
(注:*2参照)

<sessions-enabled>true</sessions-enabled>

3. xalanをlibに配置

再チャレンジ。
今度はこんなエラーが出た。

[preproegg/1.333457851422744807].<stderr>: **** MessageBrokerServlet failed to initialize due to runtime exception:   Exception: java.lang.RuntimeException: XPathFactory#newInstance() failed to create an XPathFactory for the default object model: http://java.sun.com/jaxp/xpath/dom with the XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFactory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom
	at javax.xml.xpath.XPathFactory.newInstance(Unknown Source)
	at flex.messaging.config.XPathServerConfigurationParser.initializeExpressionQuery(XPathServerConfigurationParser.java:46)
	at flex.messaging.config.AbstractConfigurationParser.parse(AbstractConfigurationParser.java:68)
	at flex.messaging.config.FlexConfigurationManager.getMessagingConfiguration(FlexConfigurationManager.java:79)
	at flex.messaging.MessageBrokerServlet.init(MessageBrokerServlet.java:106)
	at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:433)
	at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256)
	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
	at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:612)
	at org.mortbay.jetty.servlet.Context.startContext(Context.java:139)
	at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218)
	at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500)
	at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:190)
	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:167)
	at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:113)
	at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235)
	at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4755)
	at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:4753)
	at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
	at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:359)
	at com.google.net.rpc.impl.Server$2.run(Server.java:800)
	at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56)
	at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:510)
	at com.google.net.rpc.impl.Server.startRpc(Server.java:756)
	at com.google.net.rpc.impl.Server.processRequest(Server.java:348)
	at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:459)
	at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319)
	at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290)
	at com.google.net.async.Connection.handleReadEvent(Connection.java:419)
	at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:762)
	at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:207)
	at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101)
	at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251)
	at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:373)
	at java.lang.Thread.run(Unknown Source)

検索してみると、先ほど提示したサイトなどにもissues 1255 のバグみたいな事を言っているっぽい。
xalnaを置き換えればよいとの事なのでやってみる。
とりあえず、BlazeDSからxalnaを引っ張ってきてlib以下に配備した。

4. service-config.xmlをfalse に設定

再度チャレンジ。
.
..

[flexblazeds/1.333508560435318247].<stderr>: **** MessageBrokerServlet failed to initialize due to runtime exception:   Error: java.lang.NoClassDefFoundError: java.lang.management.ManagementFactory is a restricted class. Please see the Google App Engine developer's guide for more details.
	at com.google.apphosting.runtime.security.shared.stub.java.lang.management.ManagementFactory.<clinit>(ManagementFactory.java)
	at flex.management.PlatformMBeanServerLocator.getMBeanServer(PlatformMBeanServerLocator.java:38)
	at flex.management.BaseControl.register(BaseControl.java:186)
	at flex.management.runtime.AdminConsoleDisplayRegistrar.<init>(AdminConsoleDisplayRegistrar.java:40)
	at flex.management.runtime.messaging.MessageBrokerControl.<init>(MessageBrokerControl.java:85)
	at flex.messaging.MessageBroker.<init>(MessageBroker.java:269)
	at flex.messaging.config.MessagingConfiguration.createBroker(MessagingConfiguration.java:105)
	at flex.messaging.MessageBrokerServlet.init(MessageBrokerServlet.java:112)
	at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:433)
	at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256)
	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
	at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:612)
	at org.mortbay.jetty.servlet.Context.startContext(Context.java:139)
	at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218)
	at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500)
	at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:190)
	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:167)
	at 

こんなんでた(;
issues 1302 や、
上記サイトを参考にservice-config.xmlを編集する(注:2参照)

<manageable>false</manageable> 

エラーは出なくなったけど、応答がない。

5. BlazeDSのソースを修正(AbstractAmfInput.java, BaseHTTPEndpoint.java)し、再ビルド後に再配置。

ソースをダウンロードしてきて、

modules/core/src/java/flex/messaging/io/amf/AbstractAmfInput.java

を以下のように修正(58行目あたり)

    /**
     * Internal use
     * @exclude
     */
    public void setInputStream(InputStream in)
    {
        //this.in = new DataInputStream(in);    → 以下のように修正。
        this.in = new DataInputStream(new BufferedInputStream(in));
    }

それから、修正したソースを再ビルドする。

# cd blazeds-src-3.2.0.3978
# ant clean sdk common core

Buildfile: build.xml
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found.

clean:
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found.

clean:
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found.

clean:
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found.

clean:
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found.

clean:
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found.

clean:
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found.

clean:

clean:

clean:

clean:
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antcontrib.properties. It could not be found.

BUILD FAILED
/Users/hoge/Downloads/blazeds-src-3.2.0.3978/build.xml:447: The following error occurred while executing this line:
/Users/hoge/Downloads/blazeds-src-3.2.0.3978/resources/fds-ajax-bridge/build.xml:52: Problem: failed to create task or type if
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.


Total time: 0 seconds

antcontrib.propertiesが見つからないと怒られたので、ダウンロードしてくるか sudo port install ant-contrib辺りでインストールする。
今回は面倒なのでportでインストールしたら、ant1.7.1もインストールされた。

再ビルド。
文字コードの変換や、不正確な引数の警告がcompile時に表示されるが問題なしとみなし、
作成された、lib/flex-messaging-core.jarをコピーする。

[RPC Fault faultString="Detected duplicate HTTP-based FlexSessions, generally due to the remote host disabling session cookies. Session cookies must be enabled to manage the client connection correctly." faultCode="Server.Processing.DuplicateSessionDetected" faultDetail="null"]
	at mx.rpc::AbstractInvoker/http://www.adobe.com/2006/flex/mx/internal::faultHandler()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:220]
	at mx.rpc::Responder/fault()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:53]
	at mx.rpc::AsyncRequest/fault()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:103]
	at NetConnectionMessageResponder/statusHandler()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:569]
	at mx.messaging::MessageResponder/status()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\MessageResponder.as:222]

とりあえずググる。これか?BLZ-268
クラスタリングとか書いてありますね。
しかも、異種サーバの混合クラスタリングはベンダーによってseessionIdを独自処理するからサポートされていないとかかいてあるように見えるが気のせいかなぁ。

困ったなぁと思って、参考ページを読んでいると最後の方にUPDATEが書いてあり、
flex.messaging.endpoints.BaseHTTPEndpointのduplicateSessionDetectedのチェック消したwと記述されている。

というわけで、

flex.messaging.endpoints.BaseHTTPEndpoint.java

の405行目辺りのduplicateSessionDetectedのif文をコメントアウトする。

        // If more than one was found, remote host isn't using session cookies. Kill all duplicate sessions and return an error.
        // Simplest to just re-scan the list given that it will be very short, but use an iterator for concurrent modification.
/*        if (duplicateSessionDetected)
        {
            List sessions = flexClient.getFlexSessions();
            for (Iterator iter = sessions.iterator(); iter.hasNext();)
            {
                FlexSession session = (FlexSession)iter.next();
                if (session instanceof HttpFlexSession)
                    session.invalidate();
            }
            
            // Return an error to the client.
            DuplicateSessionException e = new DuplicateSessionException();
            e.setMessage(ERR_MSG_DUPLICATE_SESSIONS_DETECTED);
            throw e;
        }*/
		
        return flexClient;

再ビルド。再配備。
# おそらく、flex-messaging-core.javaだけでよいと思うが
# 自分の環境ではうまく行かなかったので、backport-util-concurrent.jar, flex-*.jar,xalan.jarを置き換えている。
# またGAEの影響で反映されなかった可能性もあるのでUPLOAD時のデプロイメントバージョンを変更してみるとよいかも。

実行する。
やたー、うまくいった。

完成したサンプルソースは以下の通り
– Java
■HelloWorld.java

package com.wordpress.prepro.remote;

public class HelloWorld {

	public String sayHello(String name) {
		return "Hello, " + name;
	}
}

– mxml

<?xml version="1.0" encoding="utf-8"?>
 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
   <mx:RemoteObject id="ro" destination="HelloWorld" endpoint="http://localhost:8080/messagebroker/amf" />
 	<mx:Script>
 		<!&#91;CDATA&#91;
 			public function textChange():void
 			{
 				trace(n.text);
 				ro.sayHello(n.text);
 			}
 		&#93;&#93;>
 	</mx:Script>
   <mx:TextInput id="n" change="textChange()"/>
   <mx:Label text="{ro.sayHello.lastResult}"/>
 </mx:Application>

– 設定ファイル
■services-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
	<services>
		<service id="remoting-service" class="flex.messaging.services.RemotingService">
			<adapters>
				<adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true" />
			</adapters>
			<default-channels>
				<channel ref="my-amf" />
			</default-channels>

			<destination id="HelloWorld">
				<properties>
		        	<source>com.wordpress.prepro.remote.HelloWorld</source>
				</properties>
			</destination>  
		</service>
	</services>

	<channels>
		<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
			<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint" />
		</channel-definition>
	</channels>

	<!-- 注:*1 -->
	<system>
		<manageable>false</manageable>
		<redeploy>
			<enabled>false</enabled>
		</redeploy>
	</system>

</services-config>

■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 xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <!-- Http Flex Session attribute and binding listener support -->
    <listener>
        <listener-class>flex.messaging.HttpFlexSession</listener-class>
    </listener>

    <!-- MessageBroker Servlet -->
    <servlet>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <display-name>MessageBrokerServlet</display-name>
        <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
        <init-param>
            <param-name>services.configuration.file</param-name>
            <param-value>/WEB-INF/flex/services-config.xml</param-value>
       </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>

	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>

■appengine-web.xml

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
	<application>preproegg</application>
	<version>1</version>

	<!-- 注:*2 -->
	<sessions-enabled>true</sessions-enabled>
	
	<!-- Configure java.util.logging -->
	<system-properties>
		<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
	</system-properties>
	
</appengine-web-app>

TODO

以下、とりあえずやったので要調査の内容。
– BlazeDSのソース修正による影響範囲。
– 各種設定ファイルへの意味
– セッションが使えるかどうか。。。BLZ-268を確認しても無理っぽい気がするが自信なし。

コメントを残す