在开发分布式系统,用的框架是EJB,其中需要调用Bean,这里分析两种EJB调用的方法。
远程调用
通过Remote接口,找到EJB服务的Bean代理,然后由代理和Bean实现交互,返回调用的结果。
- Remote接口@remote
Bean的客户端直接与EJB对象打交道,而不是Bean实现类。所以EJB必须复制Bean对象的每一个方法,Remote Interface告诉EJB对象自动生成工具需要赋值Bean类的哪些方法。
<!-- 客户bean -->
<jee:local-slsb id="EditTrainingProgramBean"
jndi-name="java:global/itoo-basic-editTrainingprogram-ear/itoo-basic-editTrainingprogram-core/editTrainingProgramsBeanImpl!com.tgb.itoo.basic.service.EditTrainingProgramBean"
business-interface="com.tgb.itoo.basic.service.EditTrainingProgramBean" />
<bean name="editTrainingProgramsController"
class="com.tgb.itoo.basic.controller.EditTrainingProgramsController">
<property name="editTrainingProgramBean" ref="EditTrainingProgramBean"></property>
</bean>
@Remote(PubliceditTrainingProgramBean.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class PubliceditTrainingProgramBeanImpl extends
BaseBeanImpl<PubliceditTrainingProgram> implements PubliceditTrainingProgramBean {
editTrainingProgramBeanImpl editTrainingProgramBeanImpl = new editTrainingProgramBeanImpl();
private editTrainingProgramBean editTrainingProgramBean = null;
private editTrainingProgramGradeCollegeBean editTrainingProgramGradeCollegeBean;
private CourseRoundBean courseRoundBean;
public PubliceditTrainingProgramBeanImpl() {
/* 培养计划 */
String ronndAddress = "itoo-basic-editTrainingProgram-ear/itoo-basic-editTrainingProgram-core-0.0.1-SNAPSHOT/editTrainingProgramBeanImpl!com.tgb.itoo.basic.service.editTrainingProgramBean";
try {
editTrainingProgramBean = (editTrainingProgramBean) this
.lookupRemoteBean(ronndAddress);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
editTrainingProgram roundResult = new editTrainingProgram();
roundResult = editTrainingProgramBean.saveRound(roundid, beginTime,
endTime, leaststTime, dataBaseName);
}
}
- 本地调用@local
有时Bean的调用并不经过网络,比如在同一个容器中不同Bean之间的调用,用户可以使用Local对象来调用Bean实例。
客户端必须与被调用的Bean在同一个JVM环境中,可以是web应用或者其他的企业Bean。
package EJBTest;
/**
* 本地调用-客户端
* @author bobo
*
*/
public class EJBRemotecontroller {
// 注入services层
private EditTrainingProgramBean editTrainingProgramBean;
/**
* services层get方法
*
* @return
*/
public EditTrainingProgramBean EditTrainingProgramBean() {
return editTrainingProgramBean;
}
/**
* services层set方法
*
* @param editTrainingProgramBean
*/
public void setEditTrainingProgramBean(
EditTrainingProgramBean editTrainingProgramBean) {
this.editTrainingProgramBean = editTrainingProgramBean;
}
/**
* 日志
*/
private static final Logger logger = Logger.getLogger(EditTrainingProgramsController.class.getName());
/**
* 培养计划
*/
@RequestMapping("/tremList")
public String toTremList(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String dataBaseName=(String) request.getSession().getAttribute (CloudContext.DatabaseName)+"_basic";
try{
// 查询所有的学期名称显示到界面上
List<DictionaryNow> tremList = editTrainingProgramBean.queryTremList(
"学期", dataBaseName);
if (tremList.size() > 0) {
request.setAttribute("tremlist", tremList);
} else {
request.setAttribute("tremlist", "");
}
// 获取专业id和专业名称
String institutionId = request.getParameter("institutionId");
String institutionName = new String(request.getParameter(
"institutionName").getBytes("ISO-8859-1"));
request.setAttribute("institutionId", institutionId);
request.setAttribute("institutionName", institutionName);
}catch (Exception e) {
e.printStackTrace();
logger.error("QuestionController.addAllUser called error {}",e);
//输入日志之后将异常抛出
throw e;
}
return "/tremList";
}
}
两种调用方法,主要取决于是否在不同Bean容器中。小型系统考虑性能最好用本地调用,分布式系统会部署到不同的服务器和JVM中,选择远程调用。