Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » MobiLink - 服务器启动的同步 » 服务器启动的同步教程 » 教程:使用网关进行的服务器启动的同步

 

第 4 课:配置通告程序

在本课中,您将配置三个通告程序事件,分别用于影响通告程序创建推式请求、向远程监听器传输请求以及删除过期请求的方式。

♦  配置通告程序属性和事件
  1. 使用 MobiLink 同步插件连接到统一数据库:

    1. 打开 Sybase Central。

    2. 在左窗格中,单击 [MobiLink 11]。

    3. 单击 [模式] » [管理]。

    4. 单击 [文件] » [连接]。

    5. 单击 [标识] 选项卡。

    6. 在 [ODBC 数据源名称] 字段中,键入 sis_cons

    7. 单击 [确定]。

  2. 在左窗格中,单击 [通知] 文件夹。

  3. 单击 [文件] » [新建] » [通告程序]。

  4. 在 [通告程序] 字段中指定 CarDealerNotifier,然后单击 [完成]。

  5. 输入 begin_poll 事件脚本。

    通告程序检测到统一数据库中的更改,并使用 begin_poll 事件创建推式请求。在这种情况下,如果 Dealer 表中发生更改,并且远程数据库不是最新的,则 begin_poll 脚本会填充 PushRequest 表。

    1. 在右窗格中,选择 CarDealerNotifier。从 [文件] 菜单中选择 [属性]。

    2. 单击 [事件] 选项卡,并为该事件选择 begin_poll。

    3. begin_poll 脚本输入以下内容:

      --
      -- Insert the last consolidated database 
      -- modification date into @last_modified 
      --
      DECLARE @last_modified timestamp;
      SELECT MAX(last_modified) INTO @last_modified FROM Dealer;
      
      --
      -- Delete processed requests if the mluser is up-to-date
      --
      DELETE FROM PushRequest
          FROM PushRequest AS p, ml_user AS u, ml_subscription AS s
          WHERE p.status = 'processed'
              AND u.name = p.mluser
              AND u.user_id = s.user_id
              AND @last_modified <= GREATER(s.last_upload_time, s.last_download_time);
      
      --
      -- Insert new requests when a device is not up-to-date
      --
      INSERT INTO PushRequest(mluser, subject, content) 
      SELECT u.name, 'sync', 'ignored'
          FROM ml_user as u, ml_subscription as s
          WHERE u.name IN (SELECT name FROM ml_listening WHERE listening = 'y')
              AND u.user_id = s.user_id
              AND @last_modified > greater(s.last_upload_time, s.last_download_time)
              AND u.name NOT LIKE '%-dblsn'
              AND NOT EXISTS(SELECT * FROM PushRequest 
                  WHERE PushRequest.mluser = u.name
                      AND PushRequest.subject = 'sync')

    在 begin_poll 脚本的第一个主数据段中,如果设备是最新的,将消除 PushRequest 表中已处理的请求:

    @last_modified <= GREATER(s.last_upload_time, s.last_download_time)

    @last_modified 是统一数据库 Dealer 表中的最大修改日期。表达式 greater( s.last_upload_time, s.last_download_time) 表示远程数据库的上次同步时间。

    也可以使用 request_delete 事件直接删除推式请求。但是,在这种情况下,begin_poll 事件可确保在远程数据库同步之前不消除已过期或隐式删除的请求。

    下一个代码段检查 Dealer 表的 last_modified 列中是否有变化,并为所有非最新的活动监听器(在 ml_listening 表中列出)发出推式请求:

    @last_modified > GREATER(s.last_upload_time, s.last_download_time)

    填充 PushRequest 表时,begin_poll 脚本将主题设置为 'sync'。

  6. 输入 request_cursor 脚本。

    request_cursor 脚本将读取推式请求。每个推式请求确定在消息中发送哪些信息以及哪些远程数据库接收这些信息。

    1. 为事件选择 [request_cursor]。

    2. 在 request_cursor 脚本的空白处输入以下代码:

      SELECT
          p.req_id,
          'Default-DeviceTracker',
          p.subject,
          p.content,
          p.mluser,
          p.resend_interval,
          p.time_to_live
          FROM PushRequest AS p

    PushRequest 表向 request_cursor 脚本提供行。

    request_cursor 结果集中的顺序和值非常重要。例如,第二个参数用于定义缺省网关 Default-DeviceTracker。设备跟踪网关将跟踪如何到达用户,并自动选择 UDP 或 SMTP 连接到远程设备。

  7. 输入 request_delete 脚本。

    request_delete 通告程序事件指定清理操作。使用此脚本,通告程序可自动删除已隐式删除和已过期的请求。

    1. 为事件选择 [request_delete]。

    2. 在 request_delete 脚本的空白处输入以下内容:

      UPDATE PushRequest SET status='processed' WHERE req_id = ?

    此 request_delete 脚本不是删除 PushRequest 表中的行,而是将行状态更新为 'processed'。

  8. 单击 [确定] 保存通告程序属性。

另请参见