メッセージ・ペイロードの使用

既存のメディエーション・ハンドラー内のメッセージ・ペイロードを処理し、メッセージ・ペイロードを別のメッセージ・フォーマットに変換することができます。

始める前に

EJB プロジェクト内でメディエーション・ハンドラーを作成または開きます。詳しくは、メディエーション・ハンドラーの作成を参照してください。 また、トピックメディエーション・プログラミングのコーディングのヒントにある、メディエーションの正しいプログラミングに関するヒントも読んでおいてください。

このタスクについて

このタスクは、メッセージ・ペイロードに関する以下のアクションの一部またはすべてを実行するために使用します。
  • メッセージ・ペイロード内のデータ・オブジェクトの配置
  • 別のフォーマットへのペイロードの変換
  • バイト配列へのペイロードの変換。例えば、メディエーションでメッセージをログに記録する場合など。
メッセージの内容を操作する場合は、SIMessage および SIMessageContext API を使用します。さらに、 メッセージを送受信できるようにメディエーションにサービス統合バスへのアクセスを提供するには、 SIMediationSession を使用します。詳しくは、以下を参照してください。

メッセージ内の特定のフィールドを使用するには、サービス・データ・オブジェクト (SDO)バージョン 1 データ・グラフを使用します。 詳しくは、SDO データ・グラフを参照してください。サポートされるメッセージ・タイプのフォーマットについての 詳細、およびそれらの使用例については、Web サービス・メッセージ用の SDO データ・グラフのマッピングを参照してください。

メッセージ・ペイロードを使用するには、以下のステップを実行します。

手順

  1. メソッド handle (MessageContext context) 内で、ファンクション・メディエーション・コードを挿入するメディエーション・ハンドラー内のポイントを位置指定します。 インターフェースは MessageContext であり、MessageContext が提供するメソッドだけを使用する場合でない限り、これを SIMessageContext にキャストする必要があります。
  2. 以下のようにして、メッセージ・ペイロードのデータ・グラフを取得します。
    1. SIMessage を MessageContext オブジェクトから取得します。 以下に例を示します。
      		SIMessage message = ((SIMessageContext)context).getSIMessage(); 
    2. メッセージ・フォーマット・ストリングを取得して、タイプを判別します。 以下に例を示します。
      String messageFormat = message.getFormat();
    3. メッセージから DataGraph オブジェクトを検索します。 以下に例を示します。
      DataGraph dataGraph = message.getDataGraph();
      詳しくは、SDO データ・グラフを参照してください。
  3. オプション: ペイロード内のデータ・オブジェクトを見つけます。
    1. グラフ内の指定の DataObject まで移動します。 例えば、DataObject の名前が「data」の場合、以下のとおりになります。
      DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
    2. データ・オブジェクトに含まれる情報を検索します。 例えばメッセージがテキスト・メッセージの場合、以下のとおりになります。
      String textInfo = dataObject.getString("value");
  4. メッセージ内のフィールドで作業します。 これを行う方法の例については、メッセージ・フィールドのコード例を参照してください。
  5. オプション: 以下のようにして、ペイロードを別のフォーマットに変換します。
    1. トピックメッセージ・フォーマット間のトランスコーディングを読んで、ペイロードのトランスコーディングによる影響を理解してください。
    2. メソッド getNewDataGraph を呼び出し、新規フォーマットをパラメーターとして渡すと、ペイロードのコピーが新規フォーマットで戻されます。 以下に例を示します。
      DataGraph newDataGraph = message.getNewDataGraph(newFormat);
    3. setDataGraph メソッドを使用して、データ・グラフを新規フォーマットでメッセージに書き戻します。 以下に例を示します。
      message.setDataGraph(newDataGraph, newFormat);
  6. オプション: 以下のようにして、ペイロードをバイトのストリームに変換します。
    1. トピックメッセージ・ペイロードのバイト配列へのトランスコーディングおよびバイト配列のメッセージ・ペイロードへのトランスコーディングを読んで、メッセージ・フォーマットからバイト・ストリーム、およびその逆の変換による影響を理解してください。
    2. メソッド getDataGraphAsBytes を呼び出します。これは、ペイロードのコピーをバイト・ストリームで戻します。 以下に例を示します。
      byte[] newByteArray = message.getDataGraphAsBytes();
    3. SIDataGraphFactory API によって提供されるメソッド createDataGraph を呼び出します。これは、メソッドに渡されたフォーマットに従ってバイトを構文解析することによって、新規データ・グラフを作成します。 以下に例を示します。
      DataGraph newDataGraph = SIDataGraphFactory.getInstance().createDataGraph( byteArray, format);
    4. メッセージをバイトのストリームとして処理します。 これを行う方法の例については、メッセージ・フィールドのコード例を参照してください。
  7. メディエーション・コードに True を返すと、 MessageContext がハンドラー・リスト内の次のメディエーション・ハンドラーに渡されます。 戻り値が False の場合、MessageContext は破棄され、宛先には配信されません。
    注: ご使用のメディエーション・ハンドラーがハンドラー・リストの最後のハンドラーで、転送ルーティング・パスが空の場合、メッセージはその宛先上のコンシューマー・アプリケーションで使用可能になります。 転送ルーティング・パスが空でない場合、その宛先のどのコンシューマーもメッセージを使用することはできません。 その代わりに、メッセージはルーティング・パス内の次の宛先に転送されます。

メッセージ・フィールドのコード例

public boolean handle(MessageContext context) throws MessageContextException {
	
			/* Get the SIMessage from the MessageContext object */
	SIMessage message = ((SIMessageContext)context).getSIMessage(); 
	
		/* Get the message format string */
	String messageFormat = message.getFormat(); 
	
		/* If you have a JMS TextMessage then extract the text contained in the message.	*/
		if(messageFormat.equals("JMS:text"))
	{
				/* Retrieve the DataGraph object from the message */
		DataGraph dataGraph = message.getDataGraph();
		
				/* Navigate down the DataGraph to the DataObject named 'data'. */
		DataObject dataObject = dataGraph.getRootObject().getDataObject("data");
		
				/* Retrieve the text information contained in the DataObject. */
				String textInfo = dataObject.get("value");
		
				/* Use the text information retrieved */
		System.out.println(textInfo);
	}
	
	
		/* Return true so the MessageContext is passed to any other mediation handlers
		* in the handler list	*/
	return true;
	
	}
メッセージ・ペイロードをバイトのストリームとして使用する完全なメディエーション機能コードは、以下の例のようになります。
  public boolean handle(MessageContext context)throws MessageContextException {
  
				/* Get the SIMessage from the MessageContext object */
		SIMessage message = ((SIMessageContext)context).getSIMessage(); 
    
    if (!SIApiConstants.JMS_FORMAT_MAP.equals(msg.getFormat()))
    {
      try
      {
        dumpBytes(msg.getDataGraphAsBytes());
      }
      catch(Exception e)
      {
        System.out.println("The message contents could not be retrieved due to a "+e);
      }
    }
    else
    {
      System.out.println("The bytes for a JMS:map format message cannot be shown.");
    }
    
    return true;
  }
  
  private static void dumpBytes(byte[] bytes)
  {
    // Subroutine to dump the bytes in a readable form to System.out
  }
}

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tjy1501
ファイル名:tjy1501.html