由上面的代码看到,EjbDelegate 只是命令的传递者而已,真是执行这个操作的地方是SLSB的execute方法。现在看看在SLSB的execute方法中到底做了些什么,如下面的代码所示:
public Response execute(Request request) throws Exception {<o:p></o:p>
logger.debug("SessionFacade execute");<o:p></o:p>
Response resp = new Response();<o:p></o:p>
if (request == null) {<o:p></o:p>
resp.setReturnCode(Response.APPLICATION_LEVEL_ERROR);<o:p></o:p>
resp.getState().setErrCode("request is Null");<o:p></o:p>
return resp;<o:p></o:p>
}<o:p></o:p>
String serviceName = request.getServiceName();<o:p></o:p>
if (serviceName == null) {<o:p></o:p>
resp.setReturnCode(Response.APPLICATION_LEVEL_ERROR);<o:p></o:p>
resp.getState().setErrCode("serviceName is Null");<o:p></o:p>
return resp;<o:p></o:p>
}<o:p></o:p>
BaseProcessor processor = (BaseProcessor) getBeanFactory().getBean(serviceName);<o:p></o:p>
try {<o:p></o:p>
processor.doActivities(request, resp);<o:p></o:p>
} catch (GoOnException e) {<o:p></o:p>
e.printStackTrace();<o:p></o:p>
} catch (Exception e) {<o:p></o:p>
e.printStackTrace();<o:p></o:p>
//抛出特定的异常。<o:p></o:p>
try {<o:p></o:p>
super.getSessionContext().setRollbackOnly();<o:p></o:p>
} catch (Exception e1) {<o:p></o:p>
e1.printStackTrace();<o:p></o:p>
throw new EJBException("事务回滚错误,抛出EJBException.");<o:p></o:p>
}<o:p></o:p>
} <o:p></o:p>
if (resp.getState().isOK()) {<o:p></o:p>
resp.setReturnCode(Response.SUCCESS);<o:p></o:p>
}<o:p></o:p>
return resp;<o:p></o:p>
}
|
SLSB的execute方法
<o:p> </o:p>
可见SLSB也不是最终调用Command的地方,它只是获得了Spring的上下文,在Spring的上下文中查找名字叫serviceName的Processor,在SLSB中如何获得Spring的上下文在Spring对EJB的支持一节中再做介绍。BaseProcessor是Processor的基类,它实现了InitializingBean, BeanNameAware, BeanFactoryAware, Processor接口,在Processor接口中有个方法doActivities,在这里调用Command的execute方法。如果在调用Processor的过程中发生了异常,则要调用SLSB的setRollbackOnly方法进行回滚。
Command实现了Component接口,Component代表了Spring管理的所有的组件。Init方法是在执行execute之前做一些相关的初始化工作,fini方法在execute方法执行后做相关的收尾工作。
public interface Component extends Serializable,BeanNameAware {<o:p></o:p>
// 初始化接口<o:p></o:p>
public abstract void init(String parameter) throws Exception;<o:p></o:p>
public abstract void execute(Map params, Map response) throws Exception;<o:p></o:p>
// 析构接口<o:p></o:p>
public abstract void fini() throws Exception;<o:p></o:p>
public ErrorHandler getErrorHandler();<o:p></o:p>
public String getBeanName();<o:p></o:p>
}
|
Component接口
<o:p> </o:p>
在POJODelegate中,由BizDelegate传过来的请求就在POJODelegate内完成。
public Response execute(Request request) throws Exception {<o:p></o:p>
logger.debug("POJODelegate execute");<o:p></o:p>
Response resp = new Response();<o:p></o:p>
if (request == null) {<o:p></o:p>
resp.setReturnCode(Response.APPLICATION_LEVEL_ERROR);<o:p></o:p>
resp.getState().setErrCode("POJODelegate REQUEST IS NULL");<o:p></o:p>
return resp;<o:p></o:p>
}<o:p></o:p>
String serviceName = request.getServiceName();<o:p></o:p>
if (serviceName == null) {<o:p></o:p>
resp.setReturnCode(Response.APPLICATION_LEVEL_ERROR);<o:p></o:p>
resp.getState().setErrCode("POJODelegate SERVICENAME IS NULL");<o:p></o:p>
return resp;<o:p></o:p>
}<o:p></o:p>
BaseProcessor processor = (BaseProcessor) ContextServiceLocator<o:p></o:p>
.getInstance().getBean(serviceName);<o:p></o:p>
processor.doActivities(request, resp);<o:p></o:p>
if (resp.getState().isOK()) {<o:p></o:p>
resp.setReturnCode(Response.SUCCESS);<o:p></o:p>
}<o:p></o:p>
return resp;<o:p></o:p>
}
|
POJODelegate的execute方法
POJODelegate在Spring的上下文中得到相应的Processor,然后交给Processor去执行。采用POJODelegate的方式,在系统启动的时候,要对Spring做初始化设置,如在得到Spring的配置文件的地址中,可以用ClassPathXmlApplicationContext,FileSystemXmlApplicationContext等进行初始化。