EJB容器之远程调用

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值