3
.
2 JCF
执行流程
<o:p></o:p>
在
BizD
elegate
中,首先会运行
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>