`
sd6292766
  • 浏览: 102245 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring rmi的记录,转载的,吃完饭等下自己要用

 
阅读更多

http://blog.csdn.net/j2ee_dev/article/details/4800693

 

1 RMI的概念

Java Remote Method Invocation (RMI) is Java's remote procedure call (RPC) mechanism. RMI allows you to write distributed objects using Java.

RMI调用的过程,我的理解大致如下:

  • 客户端和服务器端约定好要用于远程调用的方法的接口(包括方法名和输入输出参数)。
  • 服务器端将远程服务绑定到某个端口,进行TCP/IP监听(例如监听地址为rmi://127.0.0.1:1099)。
  • 客户端与服务器建立TCP/IP连接(当然事先要知道服务器端的监听地址),按照接口声明的方法发送数据(可序列化的Java对象)以及要调用的服务名、方法名等。
  • 服务器端将接收到的数据(字节流)反序列化,得到要调用的方法和参数信息;然后服务器端进行本地计算(方法调用)。
  • 服务器端将计算的结果(可序列化的Java对象)发送给客户端。
  • 客户端从接收到的返回数据(字节流)中进行反序列化,得到运算结果。
  • 客户端断开与服务器端的TCP/IP连接,远程调用结束。

2 Spring中RMI的使用

开始下面的步骤之前,我们要从Spring的网站下载开发所需要的jar包(实现RMI的部分的包在org.springframework.remoting.rmi中)。

2.1 服务器端开发

  • 声明要发布为RMI服务的接口

package demo.rmi.server;

 

/**

 * The purpose of this class is to define all presence method

 *

 */

public interface IPresence {

      /**

       * subscribe presence info for the watcher

       *

       * @param watcherUri

       * @param presentities

       */

      public void subscribePresence(String watcherUri, String[] presentities);

 

}

 

Ø      实现要发布为RMI服务的接口

package demo.rmi.server;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

/**

 * The purpose of this class is to implment presence operation

 */

public class PresenceImpl implements IPresence {

 

      private static Logger log = LoggerFactory.getLogger(PresenceImpl.class);

 

      public void subscribePresence(String watcherUri, String[] presentities) {

            if ((watcherUri == null) || (presentities == null)) {

                  log.warn("watcherUri or presentities is null!");

                  return;

            }

            if (log.isInfoEnabled()) {

                  StringBuilder s = new StringBuilder();

                  if (presentities != null) {

                        for (String str : presentities) {

                              s.append(str).append(" ");

                        }

                  }

                  log.info("subscribe presence for watcher:{}, presentities:{}",

                              watcherUri, s);

            }

      }

}

  • 发布自己的RMI服务

首先在Spring配置文件中(这里我命名为rmi-server.xml),配置所需要的Bean。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>

    <bean id="presenceService" class="demo.rmi.server.PresenceImpl" />

 

    <!-- define a RMI service listening at port 1001 -->

    <bean id="serviceExporter_1001" class="org.springframework.remoting.rmi.RmiServiceExporter">

        <property name="service">

            <ref bean="presenceService" />

        </property>

        <property name="serviceName">

            <value>presenceService</value>

        </property>

        <property name="serviceInterface">

            <value>demo.rmi.server.IPresence</value>

        </property>

        <!-- defaults to 1099 -->

        <property name="registryPort" value="1001" />

    </bean>

</beans>

 

然后启动我们的RMI服务,进行绑定和监听。

package demo.rmi.server;

 

import java.rmi.RemoteException;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.springframework.remoting.rmi.RmiServiceExporter;

 

/**

 * The purpose of this class is to represent a rmi server via spring remoting

 * support

 *

 */

public class RMIServer {

 

            private static Logger log = LoggerFactory.getLogger(RMIServer.class);

 

            /**

             * start server by hard code

             */

            public void startByAPI() {

                        RmiServiceExporter exporter = new RmiServiceExporter();

                        try {

                                    exporter.setServiceInterface(IPresence.class);

                                    exporter.setServiceName("serviceByAPI");

 

                                    exporter.setService(new PresenceImpl());

                                    exporter.setRegistryPort(1001);

 

                                    exporter.afterPropertiesSet();

                        } catch (RemoteException e) {

                                    log.error("error when export service", e);

                        }

            }

 

            /**

             * start server by configuration in bean.xml

             */

            public void startByCfg() {

                        ApplicationContext context = new ClassPathXmlApplicationContext(

                                                "rmi-server.xml");

                        if (log.isInfoEnabled()) {

                                    log.info("application context 's display name :{}", context

                                                            .getDisplayName());

                                    log.info("RMI server initialized successfully!");

                        }

            }

 

            /**

             * main method for start a rmi server

             *

             * @param args

             */

            public static void main(String[] args) {

                        // new RMIServer().startByAPI();

                        new RMIServer().startByCfg();

            }

 

}

当我们初始化Spring的ApplicationContext后,Spring会自动完成RMI服务的绑定和监听。

2.2 客户端开发

首先在Spring配置文件中(这里我命名为rmi-client.xml),配置所需要的Bean。

<?xml version="1.0" encoding="UTF-8"?>

<beans>

    <!-- define a RMI client service which send to port 1001 -->

    <bean id="prensenceServiceProxy_1001" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">

        <property name="serviceUrl">

            <value>rmi://127.0.0.1:1001/presenceService</value>

        </property>

        <property name="serviceInterface">

            <value>demo.rmi.server.IPresence</value>

        </property>

    </bean>

</beans>

然后我们可以编写客户端进行RMI调用的代码。

package demo.rmi.client;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

import demo.rmi.server.IPresence;

 

/**

 * The purpose of this class is to represent a RMI client

 */

public class RMIClient {

            private static Logger log = LoggerFactory.getLogger(RMIClient.class);

 

            /**

             * @param args

             */

            public static void main(String[] args) {

                        ApplicationContext context = new ClassPathXmlApplicationContext(

                                                "rmi-client.xml");

                        if (log.isInfoEnabled()) {

                                    log.info("application context 's display name :{}", context

                                                            .getDisplayName());

                                    log.info("RMI client initialized successfully!");

 

                        }

 

                        // test get a RMI client service via Spring API at runtime

                        // RmiProxyFactoryBean factory = new RmiProxyFactoryBean();

                        // factory.setServiceInterface(IPresence.class);

                        // factory.setServiceUrl("rmi://127.0.0.1:1002/presenceService");

                        // factory.afterPropertiesSet();

                        //

                        // IPresence service2 = (IPresence) factory.getObject();

                        //

                        // String[] wt = service2.getMyWatchers("sip:test@mycompany.com");

                        // System.out.println("service2 works fine,response watchers 's length:"

                        // + wt.length);

 

                        IPresence service = (IPresence) context

                                                .getBean("prensenceServiceProxy_1001");

                        String watcher = "sip:alice@mycompany.com";

                        String[] presentities = new String[] { "sip:bob@ mycompany.com",

                                                "sip:susan@mycompany.com" };

 

                        StringBuilder presentitiesInfo = new StringBuilder();

                        for (String str : presentities) {

                                    presentitiesInfo.append(str).append(" ");

                        }

 

                        if (log.isInfoEnabled()) {

                                    log.info("now start send subscribe presnece request for watcher:{}"

                                                            + " ,presentities:{}", watcher, presentitiesInfo);

                        }

                        service.subscribePresence(watcher, presentities);

            }

 

}

 

大家可以注意到,我分别在服务器端和客户端放入了使用Spring API动态(即不在Spring配置文件中固定配置)进行RMI监听和调用的代码,可供需要时参考。

分享到:
评论

相关推荐

    Spring RMI

    Spring的面向切面编程(AOP)可以与RMI集成,提供日志记录、性能监控、安全控制等功能。通过定义切点和通知,可以在RMI调用前后执行特定逻辑。 ### 5. Spring RMI优化 - **RMI超时设置**:可以配置RMI连接和操作的...

    Spring RMI小例子

    在这个"Spring RMI小例子"中,我们将深入理解Spring如何简化RMI的使用,以及如何通过它实现跨网络的交互。 首先,RMI允许Java对象在不同的JVM之间进行通信,仿佛它们都在同一个进程中运行。Spring通过提供自动注册...

    SpringRMI小例子

    Spring Remote Method Invocation(RMI)是Java平台上的一个远程对象调用框架,它允许一个Java对象在一台机器上执行,并且被另一台机器上的客户端调用。在这个"SpringRMI小例子"中,我们将深入探讨如何利用Spring...

    spring rmi应用

    在描述中提到的博文中,作者可能详细介绍了如何设置和使用Spring RMI。通常,这包括以下几个步骤: 1. **创建远程接口**:首先,你需要定义一个Java接口,这个接口将被实现并作为远程服务的合同。接口中的方法会被...

    spring rmi使用心得

    为了避免业务逻辑重新开发,顾使用spring rmi,把所有的bean作为rmi服务暴漏出来,在客户端只需要把项目依赖过来就ok,或者把以前的接口导入过来。 参考文档:...

    Spring Rmi使用文档

    ### Spring RMI 使用详解 #### 一、Spring RMI 概述 Spring RMI 是 Spring 框架中用于支持远程方法调用(Remote Method Invocation)的功能模块。通过 Spring RMI, 开发者能够更加简便地搭建和管理远程服务。传统上...

    spring rmi 小例子

    在本示例中,我们将探讨如何使用Spring RMI创建一个小的应用程序,这通常涉及到服务器端(服务提供者)和客户端(服务消费者)的设置。 首先,让我们了解Spring RMI的核心概念: 1. **接口定义**:在RMI中,我们...

    spring RMI简单例子

    要实现Spring RMI,我们需要以下组件: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,必须继承自`java.rmi.Remote`。例如: ```java public interface MyRemoteService extends Remote { String...

    spring和RMI分布式整合源码

    5. **客户端代码**:使用Spring的`RmiProxyFactoryBean`或`JndiObjectFactoryBean`来查找和代理RMI服务的代码,进行远程调用。 6. **测试类**:可能包含单元测试或集成测试,验证RMI服务的正确性和性能。 通过分析...

    spring rmi 改造

    可以使用Spring Boot Actuator或自定义监控工具来收集这些指标,并根据实际情况调整线程池的参数。 通过以上改造,我们实现了对Spring RMI服务的优化,有效控制了并发处理的线程数量,提高了系统资源的利用率,同时...

    spring RMI 实用分享

    在本文中,我们将深入探讨Spring框架如何集成RMI,以及如何创建和使用RMI客户端。 首先,让我们了解RMI的基本概念。RMI是一种机制,它允许一个对象在一台计算机上执行的方法可以在另一台计算机上执行,就好像这些...

    spring rmi 集成

    - `zrmiservice`:服务端代码通常位于这个目录下,包含RMI服务的实现、Spring配置文件以及启动服务器的脚本。 - `rmi-lib`:RMI运行所需的库文件。 - `zrmientry`:可能是一个主入口类或者脚本,用于启动整个RMI系统...

    spring RMI 服务(自动把service发布为RMI服务)

    在Spring框架的支持下,我们可以更方便地将服务发布为RMI服务,使得其他应用程序可以跨JVM(Java Virtual Machine)访问这些服务。下面将详细阐述Spring RMI服务的实现原理、配置过程以及如何自动化发布服务。 首先...

    spring rmi 源码

    Spring RMI(Remote Method Invocation)是Spring框架对Java RMI技术的一种封装,使得在Spring环境中使用RMI变得更加简便。RMI是一种Java平台上的远程对象调用机制,它允许一个Java对象在不同的Java虚拟机之间调用另...

    Spring-RMI.rar_spring rmi

    1.2 Spring的RMI支持:Spring通过`org.springframework.remoting.rmi.RmiServiceExporter`和`RmiProxyFactoryBean`简化了RMI的使用。`RmiServiceExporter`用于发布服务,而`RmiProxyFactoryBean`则用于创建RMI服务的...

    rmi与spring整合实例

    当我们谈论“RMI与Spring整合实例”时,我们通常是指将RMI技术与Spring框架结合使用,以便构建可扩展的、分布式的Java应用程序。下面将详细解释这两个概念以及如何将它们整合在一起。 1. RMI基础: - RMI的核心...

    spring+rmi非本地实现

    - **安全考虑**:在Web环境中,必须考虑到安全性问题,例如使用Spring Security来保护RMI接口,防止未经授权的访问。 - **负载均衡**:在大型分布式系统中,可能有多台服务器提供RMI服务。Spring可以配合负载均衡...

    如何在Spring框架中使用RMI技术.zip

    本压缩包提供了两个Java工程示例,帮助开发者了解如何在Spring环境中集成并使用RMI。 首先,让我们理解RMI的基本概念。RMI是Java提供的一种机制,使得一个Java对象能够调用运行在不同JVM上的另一个Java对象的方法。...

    java项目使用spring rmi所涉及到的包

    通过这种方式,你可以轻松地在Java项目中使用Spring RMI,实现分布式系统中的远程服务调用。同时,Spring框架提供的事务管理、AOP(面向切面编程)等功能也可以与RMI无缝集成,进一步增强系统的可维护性和扩展性。在...

Global site tag (gtag.js) - Google Analytics