分布式系统复习题chen.docx

上传人:b****5 文档编号:6872081 上传时间:2023-01-11 格式:DOCX 页数:28 大小:51.34KB
下载 相关 举报
分布式系统复习题chen.docx_第1页
第1页 / 共28页
分布式系统复习题chen.docx_第2页
第2页 / 共28页
分布式系统复习题chen.docx_第3页
第3页 / 共28页
分布式系统复习题chen.docx_第4页
第4页 / 共28页
分布式系统复习题chen.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

分布式系统复习题chen.docx

《分布式系统复习题chen.docx》由会员分享,可在线阅读,更多相关《分布式系统复习题chen.docx(28页珍藏版)》请在冰豆网上搜索。

分布式系统复习题chen.docx

分布式系统复习题chen

分布式系统练习题(J2EE)

题型:

判断(10)、简答(5)、编程(4)、主观题(3)

一、简答题

1.简述远程方法调用(RemoteMethodInvocation,RMI)的基本通信原理。

答:

远程方法调用(RMI)的基本通信原理:

客户端与服务器端内在通过套接字通信。

服务器端

1、创建远程服务对象

2、接收请求、执行并返回结果(Skeleton)

1)解码(读取)远程方法的参数;

2)调用实际远程对象实现的方法;

3)将结果(返回值或异常)返回给调用程序。

客户端

1、建立与服务器的连接

2、发送请求、接收返回结果(Stub)

1)初始化连接;

2)编码并发送参数;

3)等待方法调用结果;

4)解码(读取)返回值或返回的异常;

5)将值返回给调用程序。

 

2.简述远程方法调用(RemoteMethodInvocation,RMI)的编程模型(主要编程步骤)。

答:

远程方法调用(RMI)的编程步骤:

1)定义远程接口;

2)定义远程对象/服务;

3)定义客户应用,并与远程对象通信;

4)调用远程方法(参数及返回值)。

 

3.简述BMP实体Bean与CMP实体Bean的优缺点。

答:

1、编程方面CMP比BMP简单

BMP需要通过Bean代码实现数据库的操作;CMP则只需要做相关的映射就可以了。

2、功能方面BMP比CMP强大

CMP一般用于单表操作;BMP则可用于单表和多表操作。

 

4.简述EJB2.1规范中实体Bean的finder方法在容器中的工作机制(要求阐述客户端调用finder方法时EJB容器调用Bean方法的过程)。

答:

EJB2.1规范中实体Bean的finder方法在容器中的工作机制(容器调用机制)

1.create

 

(1)ejbCreate,若返回异常,则结束,否则转2

 

(2)ejbActivate

 (3)ejbPostCreate

 (4)ejbStore

 (5)返回结果

2.find...

 

(1)ejbFind....,若返回异常,则结束,否则转2

 

(2)对

(1)返回的结果集,逐个处理(3-5)

 (3)若对象已经存在于容器内存中,则直接使用,否则转4

 (4)从Pool中取一个空闲对象,调用ejbActivate与主键值关联

 (5)调用ejbLoad方法

 (6)返回结果

 

5.简述无状态会话Bean的生命周期(图示或文字描述均可)。

答:

无状态会话Bean的生命周期如下图所示:

6.简述有状态会话Bean的生命周期(图示或文字描述均可)。

答:

有状态会话Bean的生命周期如下图所示:

 

7.简述EJB2.1规范实体Bean的生命周期(图示或文字描述均可)。

答:

实体Bean的生命周期如下图所示:

8.简述EJB2.1规范中会话Bean的远程接口、Home接口和Bean实现类的作用。

答:

1、远程接口的作用:

定义客户机可以调用的商业方法。

2、Home接口的作用:

定义客户机可调用的Create上客户机实例化所需的对象EJB。

3、Bean实现类的作用:

Bean具体实现的功能。

 

二、编程题

1.使用EJB2.1规范编写一个无状态会话Bean,实现Fibonacci数列第n项的求解(要求使用非递归方法实现)。

已知Remote接口和Home接口代码如下:

/*Remote接口代码*/

importjava.rmi.RemoteException;

importjavax.ejb.EJBObject;

publicinterfaceFibonacciextendsEJBObject{

  //获取Fibonacci数列第n项的值(n的索引从1开始)

publiclonggetFibonacciItem(intn)throwsRemoteException;

}

/*Home接口代码*/

importjava.rmi.RemoteException;

importjavax.ejb.*;

publicinterfaceFibonacciHomeextendsEJBHome{

publicFibonaccicreate()throwsRemoteException,CreateException;

}

/*EJB实现类代码*/

importjavax.ejb.SessionBean;

importjavax.ejb.SessionContext;

importjavax.ejb.CreateException;

publicclassFibonacciEJBimplementsSessionBean{

SessionContextsessionContext;

//远程接口的方法

publiclonggetFibonacciItem(intn){

longff;

if(n<=1)

ff=1;

else

{

intx,a=0,b=l;

for(inti=2;i<=n;i++)

{

x=a;

a=b;

b=x+a;

ff=b;

}

}

returnff;

}

//EJB框架需要的方法

publicvoidejbCreate()throwsCreateException{

}

publicvoidejbRemove(){

}

publicvoidejbActivate(){

}

publicvoidejbPassivate(){

}

publicvoidsetSessionContext(SessionContextsessionContext){

this.sessionContext=sessionContext;

}

}

请编写完整的EJB实现类(实现类命名为FibonacciEJB),实现上述功能。

附注:

Fibonacci数列为形如“1,1,2,3,5,8,13,……”的数列,数列前两项为1,当n>2时当前项为前两项之和。

2.使用EJB2.1规范编写一个无状态会话Bean,实现从1到n所有被3整除,但不被7整除的整数求和(n由参数传入)。

已知Remote接口和Home接口代码如下:

/*Remote接口代码*/

importjava.rmi.RemoteException;

importjavax.ejb.EJBObject;

publicinterfaceSumextendsEJBObject{

//求解从1到n的所有被3整除,但不被7整除的整数这和

  publiclonggetSum(intn)throwsRemoteException;

}

/*Home接口代码*/

importjava.rmi.RemoteException;

importjavax.ejb.*;

publicinterfaceSumHomeextendsEJBHome{

publicSumcreate()throwsRemoteException,CreateException;

}

/*EJB实现类代码*/

importjavax.ejb.SessionBean;

importjavax.ejb.SessionContext;

importjavax.ejb.CreateException;

publicclassSumEJBimplementsSessionBean{

SessionContextsessionContext;

//远程接口的方法

publiclonggetSum(intn){

inti;

longsum=0;

for(i=1;i<=n;i++)

{

if(i%3==0)&&(i%7!

=0)

sum+=i;

}

returnsum;

}

//EJB框架需要的方法

publicvoidejbCreate()throwsCreateException{

}

publicvoidejbRemove(){

}

publicvoidejbActivate(){

}

publicvoidejbPassivate(){

}

publicvoidsetSessionContext(SessionContextsessionContext){

this.sessionContext=sessionContext;

}

}

请编写完整的EJB实现类(实现类命名为SumEJB),实现上述功能。

3.分别编制RMI和RMI-IIOP服务器端与客户端,实现累加功能。

已知远程接口如下:

publicinterfaceSumRemoteextendsjava.rmi.Remote{

//实现从1到n(n>0)累加

longsum(longn)throwsjava.rmi.RemoteException;

}

RMI服务端:

importjava.rmi.*;

publicclassSumService

extendsjava.rmi.server.UnicastRemoteObjectimplementsSumRemote{

publicSumService()throwsRemoteException{

}

//实现从1到n(n>0)累加

publiclongsum(longn){

longff=0;

intI;

for(I=1;I<=n,I++)

ff+=I;

Returnff;

}

publicstaticvoidmain(String[]args){

if(System.getSecurityManager()==null)

System.setSecurityManager(newRMISecurityManager());

try{

StringmyRMIName="SumService";

SumServiceservice=newSumService();

Naming.rebind(myRMIName,service);

System.out.print("ServiceLoaded!

");

}catch(Exceptione){

e.printStackTrace();

}

}

}

RMI客户端:

importjava.rmi.*;

publicclassSumClient{

publicSumClient(){

}

publicstaticvoidmain(String[]args){

if(System.getSecurityManager()==null)

System.setSecurityManager(newRMISecurityManager());

try{

SumRemotes=(SumRemote)Naming.lookup("SumService");

longsum=s.sum(100);

System.out.println(sum);

}catch(Exceptionex){

ex.printStackTrace();

}

}

}

RMI-IIOP服务器端:

importjavax.naming.*;

importjava.rmi.*;

importjavax.rmi.*;

publicclassSumServerextendsPortableRemoteObjectimplementsSumRemote{

publicSumServer()throwsRemoteException{

super();

}

//实现从1到n(n>0)累加

publiclongsum(longn){

longff=0;

intI;

for(I=1;I<=n,I++)

ff+=I;

Returnff;

}

publicstaticvoidmain(String[]args){

try{

SumRemoteobj=newSumServer();

Contextic=newInitialContext();

ic.rebind("SumServer",obj);

System.out.println("ServiceOK!

");

}catch(Exceptionex){

ex.printStackTrace();

}

}

}

RMI-IIOP客户端:

importjava.rmi.*;

importjavax.rmi.*;

importjavax.naming.*;

publicclassSumClient{

publicstaticvoidmain(String[]args){

try{

Contextic=newInitialContext();

Objectobj=ic.lookup(“SumServer”);

SumRemoteremoteObj=(SumRemote)PortableRemoteObject.narrow(

Obj,SumRemote.class);

System.out.println(remoteObj.sum(100));

}catch(Exceptionex){

ex.printStackTrace();

}

}

}

4.已知部署在JBOSS中的消息驱动Bean源码如下:

importjavax.ejb.*;

importjavax.jms.*;

@MessageDriven(mappedName="jms/QueueMDB",activationConfig={

@ActivationConfigProperty(propertyName="acknowledgeMode",

propertyValue="Auto-acknowledge"),

@ActivationConfigProperty(propertyName="destinationType",

propertyValue="javax.jms.Queue"),

@ActivationConfigProperty(propertyName="destination",

propertyValue="queue/queueMDB")})

publicclassQueueMDBimplementsMessageListener{

publicvoidonMessage(Messagemsg){

System.out.println(msg);

}

}

JSP客户端源码如下:

<%@pagelanguage="java"pageEncoding="ISO-8859-1"%>

<%@pageimport="javax.naming.*,javax.jms.*,java.util.Properties"%>

<%

Stringpath=request.getContextPath();

StringbasePath=request.getScheme()+":

//"+request.getServerName()+":

"+request.getServerPort()+path+"/";

%>

">

MyJSP'test.jsp'startingpage

 

ThisismyJSPpage.

<%

QueueConnectioncnn=null;

QueueSendersender=null;

QueueSessionsess=null;

Queuequeue=null;

try{

Propertiesprops=newProperties();

props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");

props.setProperty("java.naming.provider.url","localhost:

1099");

props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");

InitialContextctx=newInitialContext(props);

QueueConnectionFactoryfactory=(QueueConnectionFactory)ctx.lookup("ConnectionFactory");

cnn=factory.createQueueConnection();

sess=cnn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);

queue=(Queue)ctx.lookup("jms/QueueMDB");

}catch(Exceptione){

out.println(e.getMessage());

}

TextMessagemsg=sess.createTextMessage("Thisisatestjmsmessageforqueuemdb");

sender=sess.createSender(queue);

sender.send(msg);

sess.close();

out.println("OK");

%>

 

请编写一个JSP客户端,向该MDB发送一个文本消息,消息内容自定。

5.已知部署在JBOSS中的消息驱动Bean源码如下:

importjavax.ejb.*;

importjavax.jms.*;

@MessageDriven(mappedName="jms/TopicMDB",activationConfig={

@ActivationConfigProperty(propertyName="acknowledgeMode",

propertyValue="Auto-acknowledge"),

@ActivationConfigProperty(propertyName="destinationType",

propertyValue="javax.jms.Topic"),

@ActivationConfigProperty(propertyName="destination",

propertyValue="topic/myTopicMDB")})

publicclassTopicMDBimplementsMessageListener{

publicvoidonMessage(Messagemsg){

System.out.println(msg);

}

}

JSP客户端源码如下:

<%@pagelanguage="java"pageEncoding="ISO-8859-1"%>

<%@pageimport="javax.naming.*,javax.jms.*,java.util.Properties"%>

<%

Stringpath=request.getContextPath();

StringbasePath=request.getScheme()+":

//"+request.getServerName()+":

"+request.getServerPort()+path+"/";

%>

">

MyJSP'test.jsp'startingpage

ThisismyJSPpage.

<%

TopicConnectioncnn=null;

TopicPublishersender=null;

TopicSessionsess=null;

Topictopic=null;

try{

Propertiesprops=newProperties();

props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");

props.setProperty("java.naming.provider.url","localhost:

1099");

props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");

InitialContextctx=newInitialContext(props);

TopicConnectionFactoryfactory=(TopicConnectionFactory)ctx.lookup("ConnectionFactory");

cnn=factory.createTopicConnection();

sess=cnn.createTopicSession(false,QueueSession.AUTO_ACKNOWLEDGE);

topic=(Topic)ctx.lookup("jms/TopicMDB");

}catch(Exceptione){

out.println(e.getMessage());

}

TextMessagemsg=sess.createTextMessage("Thisisatestjmsmessagefortopicmdb");

sender=sess.createPublisher(topic);

sender

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1