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

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

 

第 4 课:配置通告程序

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

通过创建新的 MobiLink 项目连接到统一数据库。

 ♦  创建新的 MobiLink 项目
  1. 选择 [开始] » [程序] » [SQL Anywhere 12] » [管理工具] » [Sybase Central]。

  2. 从 [工具] 菜单中选择 [MobiLink 12] » [新建项目]。

  3. 在 [名称] 字段中键入 sis_cons_project

  4. 在 [位置] 字段中,键入 C:\MLsis,然后单击 [下一步]。

  5. 选中 [将统一数据库添加到项目] 选项。

  6. 在 [数据库显示名称] 字段中键入 sis_cons

  7. 单击 [编辑]。将出现 [连接到通用 ODBC 数据库] 窗口。

  8. 在 [用户 ID] 字段键入 DBA

  9. 在 [口令] 字段中键入 sql

  10. 在 [ODBC 数据源名] 字段中,单击 [浏览],然后选择 sis_cons

  11. 单击 [确定],然后单击 [保存]。

  12. 选中 [记住口令] 选项,然后单击 [完成]。

  13. 单击 [确定]。

 ♦  创建新的通告程序
  1. 在 [MobiLink 12] 下的 Sybase Central 左窗格中,依次展开 sis_cons_project、[统一数据库],然后选择 sis_cons

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

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

  4. 单击 [完成]。

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

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

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

 ♦  配置通告程序属性和事件
  1. 输入 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'。

  2. 输入 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 连接到远程设备。

  3. 输入 request_delete 脚本。

    1. 从 [事件] 列表中选择 [request_delete]。

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

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

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

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

 另请参见