content: package examples;
  
  import com.alicloud.openservices.tablestore.TunnelClient;
  import com.alicloud.openservices.tablestore.model.tunnel.CreateTunnelRequest;
  import com.alicloud.openservices.tablestore.model.tunnel.CreateTunnelResponse;
  import com.alicloud.openservices.tablestore.model.tunnel.TunnelType;
  import com.alicloud.openservices.tablestore.tunnel.worker.IChannelProcessor;
  import com.alicloud.openservices.tablestore.tunnel.worker.ProcessRecordsInput;
  import com.alicloud.openservices.tablestore.tunnel.worker.TunnelWorker;
  import com.alicloud.openservices.tablestore.tunnel.worker.TunnelWorkerConfig;
  
  public class TunnelQuickStart {
      private static class SimpleProcessor implements IChannelProcessor {
          @Override
          public void process(ProcessRecordsInput input) {
              System.out.println("Default record processor, would print records count");
              System.out.println(
                  String.format("Process %d records, NextToken: %s", input.getRecords().size(), input.getNextToken()));
              try {
                  // Mock Record Process.
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
  
          @Override
          public void shutdown() {
              System.out.println("Mock shutdown");
          }
      }
  
      public static void main() throws Exception {
          // 1. Initialize the Tunnel Client.
          final String endPoint = "";
          final String accessKeyId = "";
          final String accessKeySecret = "";
          final String instanceName = "";
  
          TunnelClient tunnelClient = new TunnelClient(endPoint, accessKeyId, accessKeySecret, instanceName);
  
          // 2. Create Tunnel (this step requires a test table to be created in advance, which can be done using SyncClient's createTable method or via the official website console, etc.).
          final String tableName = "testTable";
          final String tunnelName = "testTunnel";
          CreateTunnelRequest request = new CreateTunnelRequest(tableName, tunnelName, TunnelType.BaseAndStream);
          CreateTunnelResponse resp = tunnelClient.createTunnel(request);
          // tunnelId will be used for the initialization of TunnelWorker later, and this value can also be obtained through ListTunnel or DescribeTunnel.
          String tunnelId = resp.getTunnelId();
          System.out.println("Create Tunnel, Id: " + tunnelId);
  
          // 3. User-defined data consumption Callback, start automated data consumption.
          // There are more advanced parameters in TunnelWorkerConfig, which will not be covered here and will be introduced in a dedicated document.
          TunnelWorkerConfig config = new TunnelWorkerConfig(new SimpleProcessor());
          TunnelWorker worker = new TunnelWorker(tunnelId, tunnelClient, config);
          try {
              worker.connectAndWorking();
          } catch (Exception e) {
              e.printStackTrace();
              worker.shutdown();
              tunnelClient.shutdown();
          }
      }
  }
  