2014-10-03 73 views
0

我有不同的Axis2服务,这些服务公开了一些方法,并且希望将这些服务及其所有方法都封装在try catch中,以便能够在Axis2发送之前过滤所有发生的异常他们到客户端。我已经阅读了有关阶段和流程和处理程序以及OutFaultFlow等,但我想要的是服务级别上的某些内容,可以在启动时由服务本身进行配置。我的服务应尽可能自我包容。我已经有一些东西需要在启动时初始化,因此我已经实现了Axis2提供的ServiceLifeCycle接口。Axis2:服务级别上的所有异常的异常处理程序

但我似乎无法从提供的ConfigurationContext或AxisService获得服务周围的“更高级别”,并为任何流程注册了一些新处理程序,或者我可以拦截异常并决定如何处理继续那些。

有没有办法在启动时注册流处理程序或者形成服务级别?除了在所有暴露的方法中添加try catch之外,您还有其他想法吗?

谢谢!

回答

0

这并不难:只要使用ConfigurationContext.getAxisConfigurationAxisConfiguration.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()); 
}