У меня есть промежуточное приложение java spring, которое публикует сервисы на верхнем уровне, а также имеет клиентов Axis 2 для потребления сервисов на нижнем уровне. Когда запросы выполняются на сервисном уровне, идентификатор сеанса добавляется в контекст потока с помощью MDC (log4j 1.x).
Все наши журналы на уровне службы (вверху) и уровне интеграции (внизу) используют MDC для вывода идентификатора сеанса, чтобы эти журналы можно было сопоставить.
Сложность в том, что мне также нужно было вывести XML-запрос и ответ для клиентов axis2. Для этого я создал следующий обработчик:
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;
}
}
Также добавлено это в axis2.xml в InFlow, InFaultFlow, OutFlow, OutFaultFlow.
<handler name="XMLLoggerDispatcher" class="com.xxx.xxx.logging.AxisXmlLoggerHandler"/>
Это отлично сработало для регистрации xml, однако идентификатор сеанса не был в MDC, я предполагаю, потому что MDC копируется в дочерние потоки, а обработчики выполняются из другого пула.
Итак, вопрос, с которым я сталкиваюсь, заключается в том, как мне получить MDC в потоке обработчика?
Хотя мне действительно нужен идентификатор сеанса, так что, возможно, есть другие варианты. Например, мы добавляем идентификатор сеанса в исходящий заголовок, поэтому я подумал, что если бы я мог получить доступ к заголовку из обработчика и найти способ сопоставить сообщения запроса и ответа с помощью какого-либо другого механизма (пользовательский жизненный цикл), это также решило бы моя проблема. Однако мне не удалось найти заголовки в мыльном конверте от обработчика. Я пробовал следующие два способа из класса обработчика:
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());
}
В обоих случаях журналы не показывают заголовков. Я также пытался переходить на разные фазы в потоках без каких-либо последствий. Любая помощь будет очень признательна