3.2 JCF执行流程<o:p></o:p>
在BizDelegate中,首先会运行DelegateType的init方法,执行相关的初始化任务。在前台调用BizDelegate的相关方法的时候,首先检查一下相关参数的正确性,然后构造一个Request对象,在这个方法结束前所调用到的Command都共用这个Request请求对象。在Request中指明要调用的流程Processor和参数的名称和值,在Processor中包含了若干个Command,根据不同的Processor的实现,Command有不同的执行流程。最后交由Delegate的execute方法去执行这个Processor,返回一个Response对象,包括将要返回的数据和结果,执行成功与否的状态包含在对象state中。如下面的代码所示,现在要执行saveContactPerson这个操作,传进来一个ContactPerson参数,将参数传至Delegate中,将要执行SaveContactPersonProcessor这个Processor,然后执行Delegate的execute方法得到相应的结果。这个Processor是在哪里定义的呢?它其实是Command的封装器,封装了Command的运行规则。Processor和Command都是Spring中的一个Bean,一个Processor包含什么Command是在Spring的配置文件中定义的。在下面关于如何用Spring构建简单的工作流系统中再做详细的介绍。<o:p></o:p>
public boolean saveContactPerson(ContactPerson contactPerson, IState state) {<o:p></o:p>
logger.debug("saveContactPerson delegate.");<o:p></o:p>
if (DelegateUtil.isNullParam(contactPerson, "contactPerson", state)) {<o:p></o:p>
return false;<o:p></o:p>
}<o:p></o:p>
Request req = new Request();<o:p></o:p>
req.setServiceName(ServiceConsts.SaveContactPersonProcessor);<o:p></o:p>
req.setValue("contactPerson", contactPerson);<o:p></o:p>
try {<o:p></o:p>
Response resp = getDelegate().execute(req);<o:p></o:p>
DelegateUtil.setIState(state, resp);<o:p></o:p>
return ((Boolean) resp.getValue("resultBoolean")).booleanValue();<o:p></o:p>
} catch (Exception e) {<o:p></o:p>
DelegateUtil.handleException(e, "saveContactPerson", state);<o:p></o:p>
return false;<o:p></o:p>
}<o:p></o:p>
}
|
<o:p> </o:p>
在EjbDelegate中将请求转发给SLSB,它将执行SLSB的execute方法。在SLSB的远程接口中定义了一个商务方法execute。在Home接口中只定义一个create方法。在init方法中得到SLSB的Home接口,只在初始化的时候运行一次。如下所示:<o:p></o:p>
public interface BizFacadeRemote extends EJBObject<o:p></o:p>
{<o:p></o:p>
public Response execute(Request request) throws Exception;<o:p></o:p>
}<o:p></o:p>
|
SLSB的远程接口<o:p></o:p>
<o:p> </o:p>
public interface BizFacadeHome extends javax.ejb.EJBHome<o:p></o:p>
{<o:p></o:p>
public BizFacadeRemote create() <o:p></o:p>
throws CreateException,RemoteException;<o:p></o:p>
}<o:p></o:p>
|
SLSB的Home接口<o:p></o:p>
<o:p> </o:p>
private static BizFacadeHome home;<o:p></o:p>
private static boolean state = false;<o:p></o:p>
public Response execute(Request request) throws Exception{<o:p></o:p>
return getSessionFacade().execute(request);<o:p></o:p>
}<o:p></o:p>
public BizFacadeRemote getSessionFacade() throws RemoteException, CreateException<o:p></o:p>
{<o:p></o:p>
return home.create();<o:p></o:p>
}<o:p></o:p>
public boolean init(String jndiName)<o:p></o:p>
{<o:p></o:p>
if (state) {<o:p></o:p>
return state;<o:p></o:p>
}<o:p></o:p>
home = (BizFacadeHome) ServiceLocator.getInstance().getOne(jndiName);<o:p></o:p>
state = true;<o:p></o:p>
if (home == null) {<o:p></o:p>
logger.error("Delegate get Home Interface fail,jndi = "+ jndiName);<o:p></o:p>
state = false;<o:p></o:p>
}<o:p></o:p>
return state;<o:p></o:p>
}
|
EjbDelegate的关键代码<o:p></o:p>
<o:p> </o:p>