接着昨天的事情,继续往下走。
昨天已经成功的把数据源都增加进来了。今天就准备开始上数据了,
测试的客户端使用的是 funambol自带的那个 demo。
拷贝一份 SyncServerServlet 的定义到 web.xml 当中,增加一个 servlet mapping
<servlet> <servlet-name>SyncServerServlet</servlet-name> <display-name>SyncServerServlet</display-name> <servlet-class>com.funambol.transport.http.server.Sync4jServlet</servlet-class> <init-param> <param-name>sync-holder-class</param-name> <param-value>com.funambol.transport.http.server.LocalSyncHolder</param-value> </init-param> <init-param> <param-name>log-messages</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>dirlog-messages</param-name> <param-value>.</param-value> </init-param> <!-- Session timeout in seconds --> <init-param> <param-name>session-timeout</param-name> <param-value>900</param-value> <!-- 15 minutes --> </init-param> <init-param> <param-name>enable-compression</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>preferred-encoding</param-name> <param-value>gzip</param-value> </init-param> <init-param> <param-name>supported-encoding</param-name> <param-value>gzip,deflate</param-value> </init-param> <!-- ======================================================================= The allowed values for compression-level are the following: - DEFAULT_COMPRESSION -1 - NO_COMPRESSION 0 - BEST_SPEED 1 - BEST_COMPRESSION 9 ======================================================================= --> <init-param> <param-name>compression-level</param-name> <param-value>-1</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SyncServerServlet</servlet-name> <url-pattern>/sync/*</url-pattern> </servlet-mapping>
然后把 ds-server\default\sql\hypersonic\ 当中的 create_engine.ddl 和 init_engine.sql 都先执行一遍。
我用的是 h2 ,不过还是很顺利的就执行完了。创建了 funambol 所需要的缺省数据。
运行客户端,把 url 修改成 http://localhost:8080/sync/ 用户名使用缺省的 guest/guest
随便增加了几个联系人,然后点击 同步 按钮。
接下来,返回511错误信息。查看 logs/ds-server/ds-server.log
发现是没有定义scal 和 scard 所对应的Source。而独立运行的 funambol 是没有这个问题的。
config是全部拷贝过来的,因此区别应该是在数据库那里。
于是看 funambol 自己的数据库里面,果然有对 scard的 syncsource定义,于是插入两条这样的数据:
INSERT INTO FNBL_CLIENT_MAPPING VALUES(1,'scard','1272530711883','0','0') INSERT INTO FNBL_SYNC_SOURCE VALUES('scard','foundation/foundation/contact-foundation/SIFContactSource.xml','scard','contact-foundation')
同时,修改 SIFContactSource.xml 当中 class 的定义,指向我自己做的一个class。
原以为这样就OK了。没想到,居然报错。错误信息就是 RoutingDataSource 没办法 得到 jdbc connection。
回想起昨天 shingo7 提到的,
于是明白了,不能象我昨天的blog里面写的那么简单,而是要把 fnbluser 的定义搞成和这个一样的。
看了一下在 java 代码中是如何获取到 RoutingDataSourceConfiguration的,于是把 jetty-web.xml
修改了一下,关于 fnbluser 的定义,修改成:
<Call id="dsConf" class="com.funambol.server.db.DataSourceConfigurationHelper" name="getDBConfiguration"> </Call> <Call id="routingDsConfi" class="com.funambol.server.db.DataSourceConfigurationHelper" name="mergeConfiguration"> <Arg><New class="com.funambol.server.db.RoutingDataSourceConfiguration"/></Arg> <Arg><Ref id="dsConf"/></Arg> </Call> <New id="fnbluser" class="org.mortbay.jetty.plus.naming.Resource"> <Arg></Arg> <Arg>jdbc/fnbluser</Arg> <Arg> <New class="com.funambol.server.db.RoutingDataSource"> <Arg> <Ref id="routingDsConfi"/> </Arg> </New> </Arg> </New>
又一次以为OK了,运行还是出错。只好进入debug状态,发现在 DataSourceConfiguration 这个类当中,获取
configPath() 这个方法,返回的居然是 null/config。原来是一个环境变量没有设置的原因。于是把设置一个环境变量
-Dfunambol.home=. 再运行,就 OK了。
当然,这里OK的意思是,我自己写的 SyncSource确实被调用到了。离真正的同步,还有一段路要走。