EJB容器之远程调用

来源:互联网 发布:东方网络002175股吧 编辑:程序博客网 时间:2024/05/16 05:53

在开发分布式系统,用的框架是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中,选择远程调用。

原创粉丝点击