このレッスンでは、Notifier で Push 要求を作成し、要求をリモート Listener に送信し、有効期限が切れた要求を検出する方法に影響する、3 つの Notifier イベントを設定します。
Mobile Link 同期プラグインを使用して、統合データベースに接続します。
Sybase Central を開きます。
左ウィンドウ枠で、[Mobile Link 11] をクリックします。
[モード] - [管理] をクリックします。
[ファイル] - [接続] をクリックします。
[ID] タブをクリックします。
[ODBC データ・ソース名] フィールドに sis_cons と入力します。
[OK] をクリックします。
左ウィンドウ枠で、[通知] フォルダをクリックします。
[ファイル] - [新規] - [Notifier] をクリックします。
[Notifier] フィールドで CarDealerNotifier を指定し、[完了] をクリックします。
begin_poll イベント・スクリプトを入力します。
Notifier は、統合データベース内の変更を検出し、begin_poll イベントを使用して Push 要求を作成します。この場合、変更が Dealer テーブルで発生し、リモート・データベースが最新でない場合、begin_poll スクリプトは、PushRequest テーブルを設定します。
右ウィンドウ枠で、[CarDealerNotifier] を選択します。[ファイル] - [プロパティ] を選択します。
[イベント] タブをクリックし、イベントの begin_poll を選択します。
[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 イベントを使用して、直接 Push 要求を削除することもできます。ただし、この場合に begin_poll イベントを使用すると、リモート・データベースが同期する前に、同期期限が切れた要求や暗黙的に除外された要求が削除されないようにすることができます。
コードの次のセクションは、Dealer テーブルの last_modified カラムに加えられた変更をチェックし、ml_listening テーブルにリストされた最新の状態にないすべてのアクティブ Listener に対して Push 要求を発行します。
@last_modified > GREATER(s.last_upload_time, s.last_download_time) |
PushRequest テーブルが移植されると、begin_poll スクリプトが件名を 'sync' に設定します。
request_cursor スクリプトを入力します。
request_cursor スクリプトは、Push 要求をフェッチします。各 Push 要求により、メッセージで送信される情報、情報を受信するリモート・データベースが決まります。
イベントの [request_cursor] を選択します。
表示された領域で、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 結果セットの値は重要です。たとえば、2 番目のパラメータは、デフォルトのゲートウェイ Default-DeviceTracker を定義します。デバイス・トラッキング・ゲートウェイは、ユーザへのアクセス方法を追跡し、UDP または SMTP を自動的に選択してリモート・デバイスに接続します。
request_delete スクリプトを入力します。
request_delete Notifier イベントはクリーンアップ処理を指定します。このスクリプトを使用すると、暗黙に除外された要求、期限が切れた要求が自動的に削除されます。
イベントの [request_delete] を選択します。
表示された領域で、request_delete スクリプトに次のコードを入力します。
UPDATE PushRequest SET status='processed' WHERE req_id = ? |
request_delete スクリプトは、ローを削除するのではなく、PushRequest テーブルのローのステータスを 'processed' に更新します。
[OK] をクリックして Notifier プロパティを保存します。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |