系统包括普通日志以及服务调用日志两块,普通日志暂时通过日志拦截器统一处理,服务调用日志直接写在webservice接口中,暂有两点困惑:
1、struts拦截器处理完成日志统一管理,若要让日志拦截器捕获action异常并将日志存储至DB,只能在action中将所有Exception抛出吗,感觉不是很好,是否有隐患(之前试过用aop记录日志,不过那样的话记录操作都在service层了,访问一个action方法若包含多个service操作则会产生多条日志,没必要;配置aop的execute参数为action的话,运行时会生成代理类而找不到对应的action方法,于是就弃用了,研究不深也可能是本人配置的问题。)2、服务端接收webservice调用时日志管理涉及的事务问题,服务端处理用try..catch..块,异常日志操语句在catch块中,假若在try块中存在数据库操作并抛出异常,事务将会回滚并直接影响到catch块中的日志存储语句也不能提交,该如何处理。。
×××××××××××××××××××××××××××问题一×××××××××××××××××××××××××××××××
之前一直采用直接在action方法中记录日志:
public String toBindAppUsers(){
try {
applist = ptXrsqService.getAllValidApps(null);
info(XXX);
} catch (Exception e) {
e.printStackTrace();
error(XXX);
}
return SUCCESS;
}
现采用日志拦截器:
try {
//......省略业务代码........
invocation.invoke();
//************日志拦截正常信息************
ptLoginfoService.saveLog(××××);
//..........................
} catch (Exception e) {
//************日志拦截异常信息************
ptLoginfoService.saveLog(××××);
}
采取这种方案后,若action方法的写法不变,那try块中调用service的操作若抛出异常,则会在当前action方法被捕获,在拦截器中无法进入catch块,将action中的写法改成抛出形式(如下),在拦截器中才能捕获并存储异常日志;
public String ptLoginManage() throws Exception{
ResultPage rp = ptLoginService.getPtLoginPages(this.getPage(), this.getPageRows());
return SUCCESS;
}
总感觉所有的action方法都直接throws,隐隐觉得有什么不妥的,可能只是习惯问题了。
××××××××××××若哪位兄台有好的解决方法,求探讨分享××××××××××××××××××
×××××××××××××××××××××××××××问题二×××××××××××××××××××××××××××××××
下面是一个对外的webservice方法的代码段,同样包含了日志记录部分:
public String syncAddAppRights(String yyid, String str) {
try{
//...省略业务代码...
PtAppRight right = ptRightService.getPtAppRightByCode(yyid, rightid);
//...省略业务代码...
String info = "Added ["+add+"] Right(s), ["+exists+"] Right(s) already exists.";
ptLoginfoService.savePtWebServiceLog(0, yyid, "新增系统权限", info);
} catch (Exception e) {
ptLoginfoService.savePtWebServiceLog(1, yyid, "新增系统权限", "ERROR :"+e.toString());
e.printStackTrace();
}
其中的ptRightService、ptLoginfoService均为spring统一管理的服务bean,当调用ptRightService.getPtAppRightByCode(yyid, rightid)时,若该方法抛出数据库操作异常,程序能够正常进入catch块,也能进入ptLoginfoService.savePtWebServiceLog方法,但是事务本身会应该前面的异常而回滚。
在不影响现有的事务配置的前提下,有没有什么办法达到如代码所示的效果呢,google中.....