1. 程式人生 > >EJB容器之遠端呼叫

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中,選擇遠端呼叫。

相關推薦

EJB容器遠端呼叫

在開發分散式系統,用的框架是EJB,其中需要呼叫Bean,這裡分析兩種EJB呼叫的方法。 遠端呼叫 通過Remote介面,找到EJB服務的Bean代理,然後由代理和Bean實現互動,返回呼叫的結果。 Remote介面@remote Bean的客戶端直接與EJB物件打交道,

SpringCloud遠端呼叫Feign

一.Feign 在上篇文章中,我們使用了Ribbon的負載均衡功能,大大簡化了遠端呼叫時的程式碼: String baseUrl = "http://user-service/user/"; User user = this.restTemplate.getForObject(bas

ejb遠端呼叫 weblogic

個人認為ejb遠端呼叫非常有用,效能應該比webservice之流要好很多,配置也並不是很複雜,搞了一個下午重要搞定,記錄下來 1. 加入jar包javax.ejb_3.0.1.jar 2. 寫服務端 package com.test; public interfac

服務通訊遠端過程呼叫(RPI)

背景 您已應用微服務架構模式。服務必須處理來自應用程式客戶端的請求。此外,服務有時必須協作處理這些請求。他們必須使用程序間通訊協議。 解決方案 使用RPI進行服務間通訊。客戶端使用基於請求/回覆的協議向服務發出請求。 例子 RPI技術有很多例子 REST GRP

JAVA序列化RMI遠端呼叫

RMI(Remote Method Invocation)是Java中的遠端過程呼叫(Remote Procedure Call,RPC)實現,是一種分散式Java應用的實現方式。它的目的在於對開發人員遮蔽橫跨不同JVM和網路連線等細節,使得分佈在不同JVM上的

TIM API遠端呼叫

Tivoli identity manager 是IBM的一種身份管理軟體,提供了對企業使用者資料的統一管理的功能。 在絕大多數情況下,開發人員可以使用tim 提供的各種介面實現使用者的需求,只有在需要更高階定製的時候,才會使用TIM的api. 一般地,可以直接把TIM的應用

Java 遠端呼叫Hessian簡例

1,匯入jar包 <dependency> <groupId>org.resthub</groupId> <artifactId>hessian&

JBOSS系列(一) --EJB遠端呼叫-客戶端的配置

        EJB訪問方式分為遠端客戶端訪問、本地客戶端訪問和WebService客戶端。 所謂的EJB的遠端呼叫是說客戶端與服務端的EJB物件不在同一個JVM程序中。 本地客戶端是說客戶端與服務

【spring源碼學習】spring的IOC容器BeanFactoryPostProcessor接口學習

時機 process roc sta 自動 註解 lis nbsp factor 【一】org.springframework.beans.factory.config.BeanFactoryPostProcessor接口==>該接口實現方法的執行時機:該接口void

C++ STL 容器棧的使用

http fff bsp 結果 sta 文件 demo pac 換行 Stack 棧是種先進後出的容器,C++中使用STL容器Stack<T> 完美封裝了棧的常用功能。 下面來個demo 學習下使用棧的使用。 1 //引入IO流頭文件 2 #incl

Java並發--並發容器ConcurrentHashMap

替代 性能 新的 targe net 出現 float 分別是 unlock   下面這部分內容轉載自:   http://www.haogongju.net/art/2350374   JDK5中添加了新的concurrent包,相對同步容器而言,並發容器通過一些機制改進

Java並發--並發容器CopyOnWriteArrayList

數據 ice log 個人 one map 正在 jdk null 原文鏈接:http://ifeve.com/java-copy-on-write/     Copy-On-Write簡稱COW,是一種用於程序設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容

JAVA並發容器CopyOnWrite容器

最終一致性 使用 當我 .com 比較 響應時間 get 理解 資源 學習資源:http://www.cnblogs.com/dolphin0520/p/3938914.html   CopyOnWrite容器即寫時復制的容器。通俗的理解是當我們往一個容器添加元素的時候,不

並發容器ConcurrentHashMap(轉載)

find 介紹 CI num trie 大小 vector containe 循環 Java並發編程:並發容器之ConcurrentHashMap(轉載)   下面這部分內容轉載自:   http://www.haogongju.net/art/2350374   JDK

acm的STL容器Map篇

刪除記錄 namespace 內部數據 比賽 簡單 find函數 元素 second 處理 1.對map的簡單介紹  Map是STL的一個關聯容器,它提供一對一(其中第一個稱為關鍵字,每個關鍵字只能在map中出現一次,第二個稱為該關鍵字的值)的數據處理能力。 這裏說下map

acm的STL容器隊列篇

strong 函數 如果 name col ESS 數據 pre 適配 優先隊列,即Priority Queues 1.簡單介紹一下隊列(介紹功能,不作分析) C++隊列是一種容器適配器,它給予程序員一種先進先出(FIFO)的數據結構。1.back() 返回一個引用,指向最

ACM__容器vector

algorithm algo ive 功能 申請 for include 翻轉 vector 今天做題碰到了深搜的題,有一種存圖方式需要用到vector,對vector不是很熟悉,回顧了一下 vector都知道是一個容器,但並不準確,它是一個多功能的能夠操作多種數據結構和算

在Dubbo中開發REST風格的遠端呼叫(RESTful Remoting)

dubbo支援多種遠端呼叫方式,例如dubbo RPC(二進位制序列化 + tcp協議)、http invoker(二進位制序列化 + http協議,至少在開源版本沒發現對文字序列化的支援)、hessian(二進位制序列化 + http協議)、WebServices (文

Linux簡介遠端管理常用命令

1、重啟電腦 $ shutdown -r now # 重新啟動作業系統,其中 now 表示現在 $ shutdown now # 立刻關機,其中 now 表示現在 $ shutdown 20:25 # 系統在今天的 20:25 會關機 $ shutdown +10 # 系統再

C++STL模板庫關聯容器set/multiset

目錄 一丶關聯容器簡介.set/multiset 二丶演示程式碼. 一丶關聯容器簡介.set/multiset 我們的序列容器,底層都是線性表構成的. 比如 vector list deque. 關聯容器底層就是紅黑樹. 以set集合為例. set內部元素根據其值自動排序.每個元素的值只允