2 StreamOperationクラスの使用方法

Streamsアプリケーションは、サブスクライバを実装することで機能します。サブスクライバは、対象となる表への書込み操作で構成されるイベント・ストリームを受け取ります。

詳細は、サブスクライバの実装を参照してください。

アプリケーションがサブスクリプション・ストリームで受け取るそれぞれのイベントは、oracle.kv.pubsub.StreamOperationとして表されます。これらの各イベントは、アプリケーションでサブスクライブしている表に対するputdeleteまたはtransaction操作を表します。

ノート:

putは、put APIコール、または1つ以上のレコードを挿入または更新するSQL DML文のいずれかを表します。

詳細は、Javaダイレクト・ドライバAPIリファレンスoracle.kv.pubsub.StreamOperationクラスの概要を参照してください

StreamOperationインタフェースには、次のメソッドが用意されています。

  • StreamOperation.getType()

    StreamOperation.Typeオブジェクトを返します。これは列挙型定数であり、deleteまたはputです。たとえば:

    // so is a StreamOperation object. It is obtained using
    // NoSQLSubscriber.onNext().
    switch (so.getType()) {
        case PUT:
            {
                // Process the put operation here.
            }
            break;
        case DELETE:
            {
                // Process the delete operation here.
            }
            break;
        case TRANSACTION:
            {
                // Process the transaction operation here.
            }
            break;
        default:
            // Received an unknown and therefore illegal operation type.
            throw new IllegalStateException("... exception message ...");
    } 
  • StreamOperation.asDelete()

    操作をStreamOperation.DeleteEventオブジェクトとして返します。このオブジェクトには、delete操作に関連付けられた主キーのみが含まれます。

    // so is a StreamOperation object. It is obtained using
    // NoSQLSubscriber.onNext().
    StreamOperation.DeleteEvent de = so.asDelete();
    PrimaryKey pk = de.getPrimaryKey();
  • StreamOperation.asPut()

    操作をStreamOperation.PutEventオブジェクトとして返します。このオブジェクトを使用すると、put操作によって変更された行を取得できます。

    ノート:

    • 変更前イメージが有効でない場合、返されるイベントは、put操作の実行後の行の状態を表します。
    • 変更前イメージが有効で、ストリームに変更前イメージを含めるように構成されている場合、返されるイベントは、put操作の実行後および実行前の行の状態を表します。
    // so is a StreamOperation object. It is obtained using
    // NoSQLSubscriber.onNext().
    StreamOperation.PutEvent pe = so.asPut();
    Row row = pe.getRow();
  • StreamOperation.asTransaction()

    操作をStreamOperation.TransactionEventオブジェクトとして返します。

    トランザクション・イベント・ストリーム内の操作は、シャードで実行された順序と同じです。StreamOperation.TransactionEventオブジェクトを使用すると、トランザクション・イベントの次の内部情報を取得できます:

    • getTransactionId(): データ・ストア内のトランザクションを一意に識別するのに役立つトランザクションIDを返します。トランザクションIDはストア全体で一意の値であり、トランザクションのコミット時のシャードID、内部トランザクションIDおよびタイムスタンプで構成されます。これは、監視、デバッグなどの様々なシナリオで役立ちます。

      ノート:

      タイムスタンプは、トランザクション・イベントが生成されるデータ・ストアのタイムゾーンであり、UNIXエポック形式です。
    • getTransactionType(): トランザクション・イベントをCOMMITタイプとして返します。
    • getNumOperations(): トランザクション内の書込み操作の数を返します。
    • getOperations(): トランザクション・イベント内のputおよびdelete操作の順序付きリストを返します。
    // 'so' is a StreamOperation object. It is obtained using
    // NoSQLSubscriber.onNext().
    StreamOperation.TransactionEvent te = so.asTransaction();
    trace("Transaction event=" + te.toJsonString());
  • StreamOperation.getRepGroupId()

    このwrite操作が実行されたシャードIDを(intとして)返します。

  • StreamOperation.getSequenceId()

    この操作に関連付けられた一意の順序IDを返します。このIDは、指定されたパブリッシャに関連付けられているストリーム操作を一意に識別します。

    これらのIDを使用して、指定されたキーについて検出された操作を順序付けできます。サブスクリプションAPIでは、特定のキーのイベントの順序が、これらの操作がOracle NoSQL Databaseで適用される順序と同じであることが保証されます。サブスクリプションAPIでは、1つのキーを超える操作の順序については保証されません。

StreamOperationインタフェースから次のメソッドを使用して、表の変更前イメージを持つイベントを検証および処理できます。

  • StreamOperation.isBeforeImageEnabled(): 現在のStreamoperationイベントがサーバーに対して行われるときに、サブスクライブされた表の変更前イメージが有効にされていた場合、trueを返します。それ以外の場合はfalseを返します。

  • StreamOperation.includeBeforeImage(): 変更前イメージを含めるようにサブスクリプションを構成していた場合、trueを返します。それ以外の場合はfalseを返します。

  • StreamOperation.isBeforeImageExpired(): 変更前イメージが永続ストレージから期限切れになった場合にtrueを返します。それ以外の場合はfalseを返します。

    ノート:

    このメソッドは、このStreamOperationイベントが配信される前に変更前イメージの生成が有効にされていた表にも依存します。

    たとえば、変更前イメージを24時間のTTLで有効にする場合のシナリオについて考えてみます。ストリーミングは、変更前イメージの生成から36時間後に開始されます。有効期限チェックはtrueを返し、ストリームに変更前イメージは表示されません。

  • StreamOperation.getBeforeImage(): 行の現在のStreamOperationイベントによって表されるストリーム・イベントに関連付けられた変更前イメージを返します。次の場合、このメソッドはnullを返します:
    • 変更前イメージを含めるようにストリームが構成されていない。
    • 表の変更前イメージを有効にしていない。
    • 変更前イメージを有効にしたが、INSERTなどの書込み操作に対しては生成されない。
    • 変更前イメージを有効にして、それを含めるようにストリームを構成したが、変更前イメージの有効期限が切れている。