0

トップレイヤーでサービスを公開し、ボトムレイヤーでサービスを消費するためのAxis 2クライアントを持つミドルウェアJavaスプリングアプリケーションがあります。サービス層で要求が行われると、MDC (log4j 1.x) を使用してセッション ID がスレッド コンテキストに追加されます。

サービス層 (上) と統合層 (下) からのすべてのログは、MDC を使用してセッション ID を出力するため、これらのログを関連付けることができます。

問題は、axis2 クライアントの要求と応答の xml を出力する必要もあったことです。これを実現するために、次のハンドラーを作成しました。

public class AxisXmlLoggerHandler extends AbstractHandler {
  static Logger log = LoggerFactory.getLogger("xmlLogger");

  @Override
  public InvocationResponse invoke(MessageContext mc) throws AxisFault {
    log.info(mc.getEnvelope().toString());

    return InvocationResponse.CONTINUE;
  }
}

また、これを InFlow、InFaultFlow、OutFlow、OutFaultFlow の axis2.xml に追加しました

<handler name="XMLLoggerDispatcher" class="com.xxx.xxx.logging.AxisXmlLoggerHandler"/>

これは xml のログ記録には完全に機能しましたが、MDC が子スレッドにコピーされ、ハンドラーが別のプールから実行されるため、セッション ID は MDC にありませんでした。

だから私が直面している質問は、MDC をハンドラー スレッドにどのように取得するかということです。

本当に必要なのはセッションIDなので、他のオプションがあるかもしれません。たとえば、送信ヘッダーにセッション ID を追加するので、ハンドラーからヘッダーにアクセスし、他のメカニズム (カスタム ライフサイクル) を介して要求メッセージと応答メッセージを関連付ける方法を見つけることができれば、それも解決できると考えました。私の問題。ただし、ハンドラーからの SOAP エンベロープでヘッダーを見つけることができませんでした。ハンドラ クラスから次の 2 つの方法で試しました。

Iterator<SOAPHeader> hi = mc.getEnvelope().getHeader().examineAllHeaderBlocks();
if (!hi.hasNext()) log.info("no headers using examineAllHeaderBlocks");
while (hi.hasNext()) {
  SOAPHeader header = hi.next();
  log.info("header: "+header.getLocalName()+"   "+header.getText()+"   string: "+header.toString());
}

Iterator<OMElement> i = (Iterator<OMElement>) mc.getEnvelope().getHeader().getChildElements();
if (!i.hasNext()) log.info("no headers using getChildElements");
while (i.hasNext()) {
  OMElement test = i.next();
  log.info("header child: "+test.getText());
}

どちらの場合も、ログにはヘッダーが表示されません。また、フロー内のさまざまなフェーズに移動しようとしましたが、影響はありませんでした。どんな助けでも大歓迎です

4

1 に答える 1