« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
我的分类(专题) |
|
Blog信息 |
blog名称:行百里者半九十 日志总数:38 评论数量:21 留言数量:0 访问次数:265059 建立时间:2007年8月25日 |

| |
[Technical]WebLogic RMI学习示例 原创空间, 文章收藏, 网上资源, 随笔, 心得体会, 所见所闻, 求助, 软件技术, 电脑与网络, 科学研究, 其他
行百里者半九十 发表于 2008/9/19 21:02:55 |
WebLogic RMI学习示例
1. WebLogic下使用RMI编程的基本步骤:
l 步骤1:编写远程接口;
l 步骤2:实现远程接口;
l 步骤3:编译 Java 类;
l 步骤4:使用 RMI 编译器编译实现类;
l 步骤5:编写调用远程方法的代码。
以下用一个简单的例子来说明WebLogic下RMI编程的详细过程。
2. WebLogicRMI HelloWorld例子:
作者采用的JAVA开发工具为eclipse 3.2,jdk版本是1.4.2_11,weblogic版本是8.1.5。
1) 建立服务Project和客户端Project:
在eclipse下建立两个java project,分别命名为“RmiWlServer”和“RmiWlClient”。两个java project的目录结构通常是src和bin,我们在src下建立自己的包和相关代码文件,bin文件夹是编译好的输出文件。
2) 定义编写远程接口
可被远程调用的类,都实现某个接口。这里所说的接口应该有服务提供方根据服务享受方的需求来编写,并且该接口需要符合下列准则:
l 远程接口必须扩展接口java.rmi.Remote(其中不包含任何方法签名)。在实现接口的每个远程类中包含将实现的方法签名。
l 远程接口必须是公共的。否则,客户端在尝试加载实现它的远程对象时将出现错误。
l 与Java RMI不同,没有必要让接口中的每个方法都在其throws块中声明java.rmi.RemoteException。应用程序引发的异常可以特定于应用程序,并且可以扩展RuntimeException。WebLogicRMI为java.rmi.RemoteException设置了子类,因此如果已存在RMI类,将不必更改异常处理。
l 远程接口不会包含很多代码,所需要的只是要在远程类中实现的方法的方法签名。
在此,我们按照以上准则在RmiWlServer Project中新建一个package ,其名称为“net.vicp.fst.rmi.face.study”,并在该package中新建一个名称为“HelloWorld”的接口,下面是该接口的详细代码:
/**
* This File(HelloWorld.java) Was Created By Ivan On 2008-9-18
*/
package net.vicp.fst.rmi.face.study;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* @author Ivan
* 用途:定义服务器端和客户端的交互接口
*/
public interface HelloWorld extends Remote{
/**
* 从RMI提供者向调用者Say Hello
* @return sth said to invoker
* @throws RemoteException
*/
public String sayHello() throws RemoteException;
}
对于Java的RMI,每个实现远程接口的类必须有附带的、预先编译的代理。WebLogicRMI支持更灵活的运行时代码生成;WebLogicRMI支持动态代理和动态创建的字节代码(类型正确,但又独立于实现接口的类)。如果类实现单一的远程接口,则编译器生成的代理和字节代码将与远程接口具有相同的名称。如果类实现多个远程接口,则编译生成的代理和字节代码的名称将取决于编译器使用的名称重整。(摘抄,不好意思,忘记出处了!)
3) 实现远程接口
对于WebLogicRMI,类不需要扩展UnicastRemoteObject,而JavaRMI则要求扩展它。(可以扩展UnicastRemoteObject,但这不是必需的。)这样便能够保持一个对您的应用程序有意义的类层次。
在WeblogicServer中,Weblogic RMI和标准JAVA RMI均可使用。如果使用Weblogic RMI,则必须将“javaweblogic.rmic...”作为rmic编译器使用,并且不得将RMI实现作为“java.rmi.server.UnicastRemoteObject”的子类创建。如果使用标准JDKRMI,则必须将“%JAVA_HOME%\bin\rmic”作为rmic编译器使用,并且必须将RMI实现类作为“java.rmi.server.UnicastRemoteObject”的子类创建。
类可以实现多个远程接口,当然类也可以定义远程接口中不存在的方法,只是不能远程调用这些方法。下面给出本例中实现HelloWorld接口的代码:新建一个package,名称为“net.vicp.fst.rmi.server.study”,在该package下新建类“HelloWorldImpl”,详细代码如下:
/**
* This File(HelloWorldImpl.java) Was Created By Ivan On 2008-9-18
*/
package net.vicp.fst.rmi.server.study;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.naming.InitialContext;
import weblogic.rmi.RMISecurityManager;
import net.vicp.fst.rmi.face.study.HelloWorld;
/**
* @author Ivan 用途:HelloWorld接口的实现
*/
public class HelloWorldImpl implements HelloWorld {
private String strGot;
public HelloWorldImpl() {
super();
}
public HelloWorldImpl(String str) throws RemoteException {
super();
this.strGot = str;
System.out.println("Creating HelloWorldImpl! What You've Sent Us Is:"
+ this.strGot);
}
/**
* HelloWorld接口sayHello方法的实现
*
* @see net.vicp.fst.rmi.face.study.HelloWorld#sayHello()
*/
public String sayHello() throws RemoteException {
System.out.println("Saying Hello World To You From The RMI Server!");
return "Hello World From RMI Server!";
}
/**
* @param args
*/
public static void main(String[] args) {
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
try {
HelloWorldImpl srv = new HelloWorldImpl("HelloWorldServer");
Context ctx = new InitialContext();
ctx.bind("HelloWorldServer", srv);
System.out.println("HelloWorldServer创建并帮定到WebLogic!");
} catch (Exception e) {
System.err.println("HelloWorldServer创建或绑定到WebLogic时出现异常:");
e.printStackTrace();
}
}
}
WebLogic RMI并不要求您设置安全管理器以将安全性集成到应用程序中。安全是由 WebLogic Server对SSL和ACL的支持处理的。如果必须设置安全管理器,则可以使用自己的安全管理器,但不要将其安装在WebLogic Server中。
4) 编译Java类
使用javac或某些其他Java编译器编译.java文件,以便生成远程接口的.class文件以及实现它的类。当然,eclipse可以自动编译的,生成的class文件都在bin目录下。
5) 使用RMI编译器编译实现类
对远程类运行WebLogic RMI编译器 (weblogic.rmic),以便在运行过程中生成动态代理和字节代码。代理是远程对象的客户端代理,它将每个WebLogic RMI调用转发到与其匹配的服务器端字节代码,而此字节代码又依次将此调用转发到实际远程对象实现。要运行 weblogic.rmic,请使用命令模式:
Java weblogic.rmic nameOfRemoteClass
其中,nameOfRemoteClass 是实现远程接口的类的完整包名。对于前面使用的示例,命令将为:
Java –cp .;..\lib\weblogic.jar weblogic.rmic net.vicp.fst.rmi.server.study.HelloWorldImpl
上面的命令中“–cp .;..\lib\weblogic.jar”用来加入CLASSPATH,文件夹“lib”是与“src”和“bin”同级别的文件夹,用来存放系统中所使用的jar文件。
如果在创建存根控件或骨架类时需要保留生成的源代码,请在运行weblogic.rmic时设置标志-keepgenerated。
6) 编写调用远程方法的代码
首先,在已经建立的Project:RmiWlClient中,创建package,名称为“net.vicp.fst.rmi.client.study”;
然后,从Project:RmiWlServer中将有关接口的定义导出为jar文件,如face.jar,并将该文件放入Project: RmiWlClient的编译路径;
最后,package在“net.vicp.fst.rmi.client.study”下建立类“HelloWorldClient”,该类的详细代码如下所示:
/**
* This File(HelloWorldClient.java) Was Created By Ivan On 2008-9-18
*/
package net.vicp.fst.rmi.client.study;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import net.vicp.fst.rmi.face.study.HelloWorld;
/**
* @author Ivan 用途:调用WebLogic提供的RMI服务
*/
public class HelloWorldClient {
/**
* 定义JNDI连接字符串.
*/
public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";
public HelloWorldClient() {
}
private static InitialContext getInitialContext(String url)
throws NamingException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
return new InitialContext(env);
}
/**
* @param args
*/
public static void main(String[] args) {
try {
InitialContext ic = HelloWorldClient
.getInitialContext("t3://localhost:7001");
HelloWorld client = (HelloWorld) ic.lookup("HelloWorldServer");
System.out.println("Message Return From Server[localhost] Is:"
+ client.sayHello());
} catch (Throwable t) {
t.printStackTrace();
System.exit(-1);
}
}
}
3. 部署例子到WebLogic
1) 配置RMI服务到WebLogic上
启动WebLogic服务,登录到WebLogic的控制台,依次选择“部署-启动和关闭”,然后点击“配置新的Startup 类...”,出现下图,在图中填入所示内容:
500)this.width=500'>
500)this.width=500'>
500)this.width=500'>
2) 启动服务和客户端,测试配置结果
启动WebLogic服务,在启动过程中,系统会有提示信息,如下图所示:
500)this.width=500'>
运行客户端“HelloWorldClient”,查看客户端输出,并查看客户端输出的内容,并且服务器端控制台会输出如下内容如图:
500)this.width=500'>
500)this.width=500'>
|
|
回复:WebLogic RMI学习示例 原创空间, 文章收藏, 网上资源, 随笔, 心得体会, 所见所闻, 求助, 软件技术, 电脑与网络, 科学研究, 其他
真不准发表评论于2008/9/19 22:26:08 |
|
» 1 »
|