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

SAP Sybase SQL Anywhere 16.0 (中文) » MobiLink 服务器启动的同步 » 服务器启动的同步教程 » 教程:使用网关配置服务器启动的同步

 

第 5 课:配置通告程序

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

前提条件

本课假定您已完成前面的所有课程。 请参见第 1 课:建立统一数据库

本课假定您拥有在教程教程:使用网关配置服务器启动的同步开头的特权部分中列出的角色和特权。

上下文和注释

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

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

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

 任务
  1. 在 [MobiLink 16] 下的 Sybase Central 左窗格中,依次展开 sis_cons_project、[统一数据库],然后选择 sis_cons

  2. 右击 [通知],然后单击 [新建] » [通告程序]。

  3. 在 [您要给新通告程序指定什么名称] 字段中,键入 CarDealerNotifier

  4. 单击 [完成]。

  5. 输入 begin_poll 事件脚本。

    1. 在右窗格中,选择 [CarDealerNotifier],然后单击 [文件] » [属性]。

    2. 单击 [事件] 选项卡。

    3. 从 [事件] 列表中选择 [begin_poll]。

    4. 在提供的文本字段中键入以下 SQL 语句:



      --
      -- 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 列中是否有变化,并为所有非最新的活动 MobiLink 监听器(在 ml_listening 表中列出)发出推式请求:

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

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

  6. 输入 request_cursor 脚本。

    1. 从 [事件] 列表中单击 [request_cursor]。

    2. 在提供的文本字段中键入以下 SQL 语句:

      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 脚本。

    1. 从 [事件] 列表中单击 [request_delete]。

    2. 在提供的文本字段中键入以下 SQL 语句:

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

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

  8. 单击 [确定] 保存通告程序事件。

结果

已定义三个通告程序事件。

 另请参见