トップレイヤーでサービスを公開し、ボトムレイヤーでサービスを消費するための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());
}
どちらの場合も、ログにはヘッダーが表示されません。また、フロー内のさまざまなフェーズに移動しようとしましたが、影響はありませんでした。どんな助けでも大歓迎です