Funambol 之 自定义 SyncSource

接着昨天的事情,继续往下走。

 

昨天已经成功的把数据源都增加进来了。今天就准备开始上数据了,

测试的客户端使用的是 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 提到的,

shingo7 写道

源代码中的RoutingDataSourceConfiguration是通过下面的方法得到的
Java 代码

DataSourceConfiguration dataSourceConfiguration =
    DataSourceConfigurationHelper.getJDBCDataSourceConfiguration(name.toString());

 

于是明白了,不能象我昨天的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确实被调用到了。离真正的同步,还有一段路要走。

你可能感兴趣的:(sql,xml,SQL Server,servlet,jdbc)