2014-10-03 4 views
0

У меня разные сервисы Axis2, которые выставляют некоторые методы и хотели бы обернуть эти службы и все их методы чем-то вроде try catch, чтобы иметь возможность фильтровать все возникающие исключения до отправки Axis2 их клиенту. Я уже читал о фазах, потоках и обработчиках и OutFaultFlow и тому подобное, но то, что я хотел бы иметь, - это что-то на уровне обслуживания, которое может быть настроено самой службой во время запуска. Мое обслуживание должно быть как можно более самодостаточным. У меня уже есть некоторые вещи для службы, которые нужно инициализировать во время запуска, и поэтому я уже реализую интерфейс ServiceLifeCycle Axis2.Axis2: обработчик исключений для всех исключений на уровне обслуживания

Но я, похоже, не могу получить от предоставленного ConfigurationContext или AxisService что-то «более высокое» вокруг службы и зарегистрировать какой-либо новый обработчик для любого потока или такого, в котором я мог бы перехватывать исключения и решать, как продолжайте с ними.

Есть ли способ зарегистрировать обработчики потока или такую ​​форму уровня сервиса при запуске? Есть ли у вас какая-либо другая идея, помимо добавления try catch во все мои выставленные методы?

Спасибо!

ответ

0

Это не так сложно: просто используйте ConfigurationContext.getAxisConfiguration и AxisConfiguration.getOutFaultFlowPhases, чтобы перебирать зарегистрированные этапы в методе startUp. В настоящее время я ищу постоянную фазу, например «MessageOut», и просто add a handler с моей собственной логикой в ​​конце ее. Логика регистрации обработчика просто должна учитывать, что еще одна служба ранее уже зарегистрировала обработчик, поэтому сначала сравните имена всех зарегистрированных обработчиков с теми, которые вы предоставили себе.

Этот подход гарантирует, что обработчик регистрируется только при запуске службы и вообще не вводит никаких накладных расходов во время вызова метода. Но это, конечно, глобально.

Другой подход, который я не тестировал, - использовать MessageContext, чтобы получить OutTransport и register a handler. Это может быть или не быть сообщением местного, но, возможно, стоит попробовать кого-то.

synchronized static void register(ConfigurationContext context) 
{ 
    Phase hookPhase = null; 
    for (Phase phase: context.getAxisConfiguration().getOutFaultFlowPhases()) 
    { 
     for (Handler handler : phase.getHandlers()) 
     { 
      if (WsExceptionFilter.isMe(handler)) 
      { 
       return; 
      } 
     } 

     if (phase.getPhaseName().equals("MessageOut")) 
     { 
      hookPhase = phase; 
     } 
    } 
    if (hookPhase == null) 
    { 
     throw new UnsupportedOperationException("Missing hook phase."); 
    } 

    hookPhase.addHandler(new WsExceptionFilter()); 
} 
Смежные вопросы