我有不同的Axis2服务,这些服务公开了一些方法,并希望将这些服务及其所有方法包装在try catch之类的东西中,以便能够在Axis2将它们发送给客户端之前过滤所有发生的异常。我已经阅读了有关阶段和流程,处理程序以及OutFaultFlow等的信息,但是我想了解的是服务级别的东西,可以在启动时由服务本身进行配置。我的服务应尽可能地自给自足。每个服务我已经有一些东西需要在启动时进行初始化,因此已经实现了ServiceLifeCycle Axis2提供的接口。
但是我似乎无法从提供的ConfigurationContext或AxisService到服务周围的“更高”的东西,并为任何可以拦截异常并决定如何进行处理的流程注册新的处理程序。
是否有任何方法可以在启动时注册流处理程序或此类服务级别?除了在我所有公开的方法中添加try catch之外,您还有其他想法吗?
谢谢!
一点也不难:只需使用ConfigurationContext.getAxisConfiguration和AxisConfiguration.getOutFaultFlowPhases来迭代startUp方法中的已注册阶段。我目前正在搜索一个始终存在的阶段,例如“ MessageOut”,并在其末尾添加一个带有我自己的逻辑的处理程序。注册处理程序的逻辑只需要考虑到另一项服务可能已经注册了处理程序,因此首先将所有已注册处理程序的名称与您自己提供的名称进行比较。
这种方法保证了处理程序仅在服务启动时注册,并且根本不会在方法调用期间引入任何开销。但这当然是全球性的。
我未测试的另一种方法是使用MessageContext获取OutTransport并在其上注册一个处理程序。那可能不是本地消息,但也许值得一试。
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());
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句