样本 Java MIDP 同步应用程序

有一些样本 Java 应用程序可帮助您编写用于 DB2 Everyplace 的 Java 同步应用程序。对于 MIDP 同步提供程序,样本位于以下位置:

%DSYINSTDIR%/Clients/Midp/samples

主要的样本是 com/ibm/mobileservices/demoVNurse.javaNursesAid.jar 下的 Visiting Nurse 应用程序。在同一样本目录下有两个构成简单应用程序的文件。此应用程序不提供“记录存储管理”(RMS)代码或固定的用户界面。这两个文件是:

有关 ISyncWorker.java 文件的详细信息

样本程序 SyncWorker.java 演示 如何为 DB2 Everyplace MIDP 同步提供程序编码 Sync Client 应用程序。

Java 样本应用程序执行下列步骤:

  1. 导入 DB2 Everyplace 同步包。
          import com.ibm.mobileservices.isync.*;
    import com.ibm.mobileservices.isync.event.*;
          import com.ibm.mobileservices.isync.midp.*;
     
    
  2. 实现 ISyncListener 接口的 eventIssued 方法,以在同步期间获取事件通知。
  3. 获取实例 MIDPISyncProvider
  4. 从提供程序对象获取同步服务的实例
  5. 从服务对象获取配置存储的实例
  6. 从配置存储对象获取同步驱动程序的实例
  7. 注册实现 ISyncListener 接口的应用程序侦听器对象,以在同步期间从同步驱动程序对象获取事件通知
  8. 在所有启用的预订集上执行同步。检查返回码和异常以获取同步的状态。
  9. 关闭并释放由同步提供程序分配的所有资源。

ISyncSample.java 示例

以下示例包含注释,这些注释涉及先前节中的步骤。

// Example 1:  ISync Java - Simple API usage
//
 
	// Step 1:  import the Sync Client Java packages 
      //
      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;
	}
 
   // Step 2:  implement the eventIssued() method in the ISyncListener interface  
   //          if you are interested in event notification (optional)
   // 
	
	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);
 
		
         // Step 3:  get an instance MIDPISyncProvider 
         //
			provider = MIDPISyncProvider.getInstance();
 
         // Step 4:  get an instance of synchronization service from the provider
         //
				Hashtable ht = new Hashtable();
				ht.put("isync.user", userName);
				ht.put("isync.password", password);
				ht.put("isync.trace", "detailed");
 
				service = provider.createSyncService(URI, ht);
 
         // Step 5:  get an instance of the configuration store
         // 
			config = service.getConfigStore(null);
 
         // Step 6:  get an instance of the sync driver to perform synchronization
         // 
			syncer = config.getSyncDriver();
 
         // Step 7:  set the listener object for event notification 
         //     from the syncer object during synchronization
         // 
			syncer.setSyncListener(this);
 
            // Step 8:  perform synchronization on all enabled subscription sets
            //
 
			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;
			}        
		//  Step 9: Close all resources
		//
 
			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;
	}
}
 

相关任务

相关概念