Как передать информацию о сеансе обработчику Axis2

У меня есть промежуточное приложение 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());
}

В обоих случаях журналы не показывают заголовков. Я также пытался переходить на разные фазы в потоках без каких-либо последствий. Любая помощь будет очень признательна


person Joshua Page    schedule 18.04.2014    source источник


Ответы (1)


Чтобы получить заголовки запроса, используйте MessageContext.getCurrentMessageContext, скелет может получить идентификатор сеанса и установить его в качестве заголовка и получить доступ к тому же заголовку в обработчике и добавить идентификатор сеанса в ваш ответ или в ur Logger MDC (аналогично идентификатору корреляции)

В параметре обработчика для метода вызова находится контекст ответного сообщения.

   invoke(MessageContext msgContext) - This is response message context

    MessageContext reqMsgCtx = MessageContext.getCurrentMessageContext(); - This gives    request message context
    //Get header with following code
    SOAPEnvelope env = reqMsgCtx.getEnvelope();
    SOAPHeader aSoapHeader = env.getHeader();
   //Your code to add the headerblocks to response message header 
person Mano    schedule 22.05.2014
comment
Это кажется разумным, к сожалению, я увидел это после ухода из компании и больше не могу проверять в нашем коде. но надеюсь, что это поможет кому-то еще - person Joshua Page; 24.03.2017