Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » QAnywhere » チュートリアル:TestMessage の解説

 

レッスン 4:TestMessage クライアントのソース・コードの概要

背景

この項では、TestMessage クライアント・アプリケーションのソース・コードの内容について簡単に説明します。

コードの多くは、メッセージを送信、受信、表示するための Windows インタフェースの実装です。しかし、ここでは、QAnywhere の機能を実装しているコードを中心に解説していきます。

TestMessage のソース・コードは、Samples\QAnywhere にあります。

TestMessage のソース・コードにはいくつかのバージョンがあります。Windows 2000 と Windows XP 用に次のバージョンが用意されています。

  • Microsoft Foundation Classes を使用して作成された C++ バージョンは、Samples\QAnywhere\Windows\MFC\TestMessage\TestMessage.sln として提供されています。

  • .NET Framework を使用して作成された C# バージョンは、Samples\QAnywhere\Windows\.NET\CS\TestMessage\TestMessage.sln として提供されています。

  • Java バージョンは、Samples\QAnywhere\Java\TestMessage\TestMessage.java として提供されています。

.NET Compact Framework については、次のバージョンがあります。

  • .NET Compact Framework を使用して作成された C# バージョンが、Samples\QAnywhere\Windows Mobile Classic\.NET\CS\TestMessage\TestMessage.sln として提供されています。

必要なソフトウェア

ソリューション・ファイルを開いたり、.NET Framework プロジェクトや .NET Compact Framework プロジェクトをビルドしたりする場合は、Visual Studio 2005 以降が必要です。

C# ソースの確認

この項では、C# バージョンのソース・コードについて解説します。C# バージョンと Visual Basic .NET バージョンは、構成が非常によく似ています。

このレッスンでは、アプリケーションのすべての行を順に確認することはしません。QAnywhere アプリケーションの理解に特に役立つ行だけを確認します。解説には C# バージョンのコードを使用します。

  1. いずれかのバージョンの TestMessage プロジェクトを開きます。

    ソリューション・ファイルをダブルクリックして、Visual Studio 内で目的のプロジェクトを開きます。たとえば、Samples\QAnywhere\Windows\.NET\CS\TestMessage\TestMessage.sln はソリューション・ファイルです。さまざまな環境向けに複数のソリューション・ファイルが用意されています。

  2. ソリューション・エクスプローラが開いていることを確認します。

    ソリューション・エクスプローラは、[表示] メニューから開くことができます。

  3. [ソース ファイル] フォルダの内容を確認します。

    特に重要なファイルが 2 つあります。MessageList ファイル (MessageList.cs) は、メッセージを受信して、表示する機能を実現します。NewMessage ファイル (NewMessage) は、メッセージの作成と送信を可能にします。

  4. ソリューション・エクスプローラで、MessageList ファイルを開きます。

  5. インクルードされているネームスペースを調べます。

    QAnywhere アプリケーションは、いずれも iAnywhere.QAnywhere.Client ネームスペースをインクルードしている必要があります。このネームスペースを定義するアセンブリは、iAnywhere.QAnywhere.Client.dll という DLL として提供されています。ファイルは、次の場所にあります。

    • .NET Framework 2.0:install-dir\Assembly\v2
    • .NET Compact Framework 2.0:install-dir\ce\Assembly\v2

    ユーザ独自のプロジェクトでは、コンパイル時にこの DLL への参照をインクルードする必要があります。このネームスペースは、各ファイルの先頭行で、次のようにインクルードされています。

    using iAnywhere.QAnywhere.Client;
  6. startReceiver メソッドを調べます。

    MessageList_Load メソッドは、以下に示す、各 QAnywhere アプリケーションに共通する初期化処理を実行します。

    • QAManager オブジェクトを作成する。

      _qaManager = 
      QAManagerFactory.Instance.CreateQAManager();

      QAnywhere には、QAManager オブジェクトを作成するための QAManagerFactory オブジェクトが用意されています。QAManager オブジェクトは、QAnywhere のメッセージング操作を処理します。具体的には、メッセージの受信 (キューからのメッセージの取り出し) とメッセージの送信 (キューへのメッセージの登録) を処理します。

      QAnywhere には、QAManager と QATransactionalManager の 2 種類の Manager が用意されています。QATransactionalManager を使用すると、送信と受信はすべてトランザクション内で処理されます。したがって、すべてのメッセージが送信 (受信) されるか、何も送信 (受信) されないかのどちらかになります。

    • メッセージを処理するメソッドを記述する。

      システム関連メッセージではない通常のメッセージを処理するための onMessage() メソッドが、QAnywhere から呼び出されます。このメソッドが受信するメッセージは、QAMessage オブジェクトとしてエンコードされています。この QAMessage クラスとその子クラス (QATextMessage と QABinaryMessage) のプロパティとメソッドに、QAnywhere アプリケーションが必要とするメッセージ関連情報が格納されています。

      private void onMessage( QAMessage msg ) {
         Invoke( new onMessageDelegate( onMessageReceived ),
            new Object [] { msg } );
      }

      このコードは Form の Invoke メソッドを使用して、基本のウィンドウを実行するスレッドでイベントが処理されるようにします。これにより、ユーザ・インタフェースが更新されてメッセージが表示できるようになります。これは、QAManger を作成したスレッドでもあります。一部の例外を除き、QAManager にアクセスできるのは、その QAManager を作成したスレッドだけです。

    • MessageListener を、MessageList_Load メソッド内で定義されたとおりに宣言する。

      _receiveListener = new 
          QAManager.MessageListener( onMessage );

      メッセージが QAnywhere Agent によって受信され、アプリケーションが待機しているキューに登録されると、OnMessage() メソッドが呼び出されます。

      メッセージ・リスナと通知リスナ

      メッセージ・リスナは、Push 通知によるメッセージングのシナリオで説明した Listener コンポーネントとは異なります。この Listener コンポーネントが通知を受信するのに対し、メッセージ・リスナ・オブジェクトはキューからメッセージを取り出します。

    メッセージ・リスナがキューに割り当てられると、QAnywhere Manager は、キューに着信したメッセージを、そのキューに割り当てられているリスナに渡すようになります。1 つのキューに複数のリスナを割り当てることはできません。キューに NULL リスナを割り当てると、そのキューへのリスナの割り当てが解除されます。

    MessageListener 実装では、メッセージは非同期的に受信されます。メッセージを同期的に受信することもできます。同期的なメッセージ受信では、アプリケーションは、キューにメッセージが着信した時点で通知を受けるのではなく、キューに登録されたメッセージを明示的に (たいていの場合は [再表示] ボタンのクリックなどのユーザ・アクションに応答して) 検索します。

    その他の初期化タスクには、次のものがあります。

    • QAManager オブジェクトをオープンして開始する。

      _qaManager.Open( 
              AcknowledgementMode.EXPLICIT_ACKNOWLEDGEMENT );
      _qaManager.Start();

      AcknowledgementMode 列挙定数は、メッセージの受信確認応答を送信元に返す方法を決定します。EXPLICIT_ACKNOWLEDGEMENT 定数は、QAManager のいずれかの受信確認メソッドが呼び出されるまでメッセージが受信確認されないことを意味します。

    • キュー内で待ち状態にあるメッセージをすべてロードする。

      loadMessages();
    • 以降のメッセージが着信するキューにリスナを割り当てる。

      リスナは、MessageList_Load() メソッド内で宣言されています。

      _qaManager.SetMessageListener( 
        _options.ReceiveQueueName,
        _receiveListener );

      Options の ReceiveQueueName プロパティには、文字列 testmessage が含まれています。これは、TestMessage アプリケーションの [Options] ウィンドウで設定された TextMessage アプリケーション用のキューです。

  7. 同じファイルにある addMessage() メソッドを調べます。

    このメソッドは、アプリケーションがメッセージを受信するたびに呼び出されます。メッセージのプロパティ (返信アドレスや適切な名前など) と送信時刻 (タイムスタンプ) を取得して、TestMessage のユーザ・インタフェースにこれらの情報を表示します。次のコードは、受信メッセージを QATextMessage オブジェクトにキャストして、メッセージの返信アドレスを取得します。

    text_msg = ( QATextMessage )msg;
    from = text_msg.ReplyToAddress;

    MessageList ファイルに基づいて実行される主要なタスクの紹介は、これで終わりです。

  8. ソリューション・エクスプローラで、NewMessage ファイルを開きます。

  9. sendMessage() メソッドを調べます。

    このメソッドは、[New Message] ウィンドウに入力された情報を引数として、QATextMessage オブジェクトを生成します。QAManager オブジェクトは、送信メッセージをキューに登録します。

    次のコードでは、QATextMessage オブジェクトを生成し、その ReplyToAddress プロパティを設定しています。

    qa_manager = MessageList.GetQAManager();
    msg = qa_manager.CreateTextMessage();
    msg.ReplyToAddress = MessageList.getOptions().ReceiveQueueName;

    次のコード行では、送信メッセージをキューに登録しています。変数 dest は送信先アドレスです。送信先アドレスは、この関数の引数として渡されます。

    qa_manager.PutMessage( dest, msg );
参照