DB2 Everyplace の Java 同期アプリケーションを作成するうえで役立つ、いくつかの Java サンプル・アプリケーションが用意されています。MIDP 同期プロバイダーの場合、サンプルは次の場所にあります。
%DSYINSTDIR%/Clients/Midp/samples
基本サンプルは、com/ibm/mobileservices/demo にある Visiting Nurse アプリケーション、VNurse.java および NursesAid.jar です。同じサンプル・ディレクトリーに、単純なアプリケーションを 構成する 2 つのファイルがあります。このアプリケーションでは、Record Store Management (RMS) コード や固有のユーザー・インターフェースは用意されていません。ファイルは、次のとおりです。
ISyncWorker.java ファイルの詳細
サンプル・プログラム SyncWorker.java では、DB2 Everyplace MIDP 同期 プロバイダー用の同期クライアント・アプリケーションのコーディング方法を示しています。
Java サンプル・アプリケーションは、次のステップを実行します。
import com.ibm.mobileservices.isync.*; import com.ibm.mobileservices.isync.event.*; import com.ibm.mobileservices.isync.midp.*;
ISyncSample.java の例
次の例には、前のセクションのステップを参照するコメントが記載されています。
// 例 1: ISync Java - 単純な API の使用法 // // ステップ 1: 同期クライアント Java パッケージのインポート // import com.ibm.mobileservices.isync.*; import com.ibm.mobileservices.isync.event.*; import com.ibm.mobileservices.isync.midp.*; /** Supporting class which handles all of the synchronization tasks. Called by ISyncSample. */ public class SyncWorker extends Thread implements ISyncListener { private ISyncSample midlet; private boolean mCancel; private ISyncProvider provider; private ISyncService service; private ISyncConfigStore config; private ISyncDriver syncer; private String eventString; public SyncWorker(ISyncSample midlet) { this.midlet = midlet; mCancel = false; } // ステップ 2: ISyncListener インターフェースの eventIssued() メソッドのインプリメント // (オプショナル:イベント通知に興味がある場合) // public int eventIssued(ISyncEvent evt) { int evtType = evt.getEventType(); int evtCode = evt.getEventCode(); int evtProg = evt.getSyncProgress(); String ssName = evt.getSubscriptionSetName(); Object listenerInfo = evt.getEventInfo(); Exception e = null; ConflictReader cr = null; if (listenerInfo instanceof Exception) e = (Exception) listenerInfo; else if (listenerInfo instanceof ConflictReader) cr = (ConflictReader) listenerInfo; eventString += evtCode + ":"; switch(evtType) { // display event status case ISync.EVTTYPE_INFO: switch (evtCode) { case ISync.EVT_INF_SYNCING_SUBS: midlet.updateSyncStat1("Synchronizing " + ssName); midlet.updateSyncStat2(" "); break; case ISync.EVT_INF_SYNC_STARTED: midlet.updateSyncStat1("Synchronization started"); midlet.updateSyncStat2(" "); break; case ISync.EVT_INF_PREP_MSG: midlet.updateSyncStat2("Preparing message..."); break; case ISync.EVT_INF_SEND_MSG: midlet.updateSyncStat2("Sending message..."); break; case ISync.EVT_INF_WAIT_MSG: midlet.updateSyncStat2("Awaiting server reply..."); break; case ISync.EVT_INF_APPLY_MSG: midlet.updateSyncStat2("Applying server message..."); break; case ISync.EVT_INF_SYNC_CANCELED: midlet.updateSyncStat1("Synchronization canceled"); midlet.updateSyncStat2(" "); break; case ISync.EVT_INF_SYNC_SUCCEEDED: midlet.updateSyncStat1("Synchronization succeeded"); midlet.updateSyncStat2(" "); break; case ISync.EVT_INF_SYNC_FAILED: midlet.updateSyncStat1("Synchronization failed"); midlet.updateSyncStat2(" "); break; default: break; } return ISync.RTNCB_DONE; case ISync.EVTTYPE_ERROR: midlet.updateSyncStat2("Error: " + evtCode); return ISync.RTNCB_DONE; case ISync.EVTTYPE_RETRY: midlet.updateSyncStat2("Retry: " + evtCode); return ISync.RTNCB_REPLY_YES; case ISync.EVTTYPE_CONFLICT: if (evtCode == ISync.EVT_CFT_REJECT) { String tabName = evt.getSubscriptionName(); midlet.updateSyncStat2("Conflict: " + tabName); /* Application needs to do the right thing with conflictRow. */ // System.out.println("Conflict table " + tabName // + " row: " + conflictRow); } return ISync.RTNCB_DONE; // ignore other event types default: break; } // let sync engine take default action return ISync.RTNCB_DEFAULT ; } // end of eventIssued() /* Synchronization is implemented in a thread to allow the user to cancel the request which single-threaded, might be hung on in IO request */ public void run() { sync(); } public void cancel() { try { if (syncer != null) syncer.cancelSync(); } catch (ISyncException iex) {} mCancel = true; } private void sync() { try { eventString = " "; String user = "nurse1"; String password = "nurse1"; String host = "localhost"; String port = "9080"; /* If jad file has values, use them, see DeployManifest.java in tools. In the Sun WirelessToolkit, under Settings, you can enter values in the User Defined tab. */ String x = midlet.getAppProperty("Db2eSyncUserName"); if (x != null) user = x; x = midlet.getAppProperty("Db2eSyncPassword"); if (x != null) password = x; x = midlet.getAppProperty("Db2eSyncHost"); if (x != null) host = x; x = midlet.getAppProperty("Db2eSyncPort"); if (x != null) port = x; midlet.appendForm(host + ":" + port + " " + user + "/" + password); // ステップ 3: インスタンス MIDPISyncProvider の取得 // provider = MIDPISyncProvider.getInstance(); // ステップ 4: プロバイダーからの同期サービスのインスタンスの取得 // Hashtable ht = new Hashtable(); ht.put("isync.user", userName); ht.put("isync.password", password); ht.put("isync.trace", "detailed"); service = provider.createSyncService(URI, ht); // ステップ 5: 構成ストアのインスタンスの取得 // config = service.getConfigStore(null); // ステップ 6: 同期を実行するための同期ドライバーのインスタンスの取得 // syncer = config.getSyncDriver(); // ステップ 7: 同期時における同期ドライバー・オブジェクトからの // イベント通知用のリスナー・オブジェクトの設定 // syncer.setSyncListener(this); // ステップ 8: 使用可能になったすべてのサブスクリプション・セットでの同期の実行 // int rc = syncer.sync(); switch (rc) { case ISync.RTN_SUCCEEDED: midlet.reportSyncStatus("Synchronization succeeded " + eventString); break; case ISync.RTN_CANCELED: midlet.reportSyncStatus("Synchronization canceled " + eventString); break; default: midlet.reportSyncStatus("Synchronization failed " + eventString); break; } // ステップ 9: すべてのリソースのクローズ // close(); } catch (ISyncException iex) { midlet.reportSyncStatus("Exception Code: " + iex.getCode() + ", Event codes: " + eventString); } catch (Exception e) { midlet.reportSyncStatus(e.toString()); } finally { mCancel = false; } } private void close() throws ISyncException { if (syncer != null) { syncer.close(); syncer = null; } if (config != null) { config.close(); config = null; } if (service != null) { service.close(); service = null; } provider = null; } }
関連したタスク
関連した概念