- 浏览: 102651 次
- 性别:
- 来自: 上海
最新评论
-
karistino:
设定的进程数目不同时统计的关键字个数不一样
JAVA多线程读写文件范例 -
sd6292766:
在系统的服务进程中,找到“DCom Server Proces ...
报错com.jacob.com.ComFailException: Can't co-create object时, 另外的解决途径 -
zyh3380433:
怎么解决?????
报错com.jacob.com.ComFailException: Can't co-create object时, 另外的解决途径 -
sd6292766:
ribavnu 写道线程锁。求楼主继续霸气啊,来个把钱存到数据 ...
JAVA多线程的一个复习例子(取款同步)(希望大家不要看源代码,看题目自己写出实现) -
ribavnu:
线程锁。求楼主继续霸气啊,来个把钱存到数据库的,然后数据库实现 ...
JAVA多线程的一个复习例子(取款同步)(希望大家不要看源代码,看题目自己写出实现)
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监听和调用的代码,可供需要时参考。
发表评论
-
转载:常见数据库字段类型与java.sql.Types的对应
2013-08-08 15:34 1776今天工作时候,刚好碰到类型转换错误的现象。找到一篇这样的列表文 ... -
maven+eclipse3.7+web工程开发+tomcat7.0搭环境的一些心得
2013-02-20 19:50 3782开头第一句话,过程真的很累,现在还存在一些细节问题。因 ... -
eclipse下使用ORACLE11GR1运行项目的一个要点记录
2013-02-20 00:06 1593参考资料:http://www.cnblogs.com ... -
报错com.jacob.com.ComFailException: Can't co-create object时, 另外的解决途径
2012-12-12 17:08 20793对于JAVA在调用打印控件jacob时,会出现这样的报错提示。 ... -
转载:maven Nexus入门指南
2012-12-02 23:38 1118因本人电脑故障,需要重启,特地用博客记下地址,方便下次学习 ... -
JAVA多线程读写文件范例
2012-11-22 01:04 5511在写之前先声明,本文是基于之前在博客园网站上检索到的一 ... -
转载:JAVA开发人员成长路线
2012-11-18 17:24 1371转载地址:http://samter.it ... -
转载: 从JAVA多线程理解到集群分布式和网络设计的浅析
2012-10-25 23:58 1581转载地址:http://blog.csdn.net/tujiy ... -
mysql一个怪现象,百思不得其解
2012-10-03 17:42 874今天在JBOSS上配置JMS时,需要配置MYSQL 的 ... -
今天安装了apache服务器
2012-09-28 15:23 940今天因为我机器搭环境需要,安装了APACHE服务器 ... -
Spring的JdbcTemplate做个简单记录,方便记忆
2012-09-16 17:50 1027调用jdbcTemplate的UPDATE方法时,返回 ... -
转载:软件工程术语英语表达
2012-07-20 13:51 1261这里记录一下,常用的建模工具都是英文版的,这样方便校对 ... -
LOG4J工作中的一些个人收获
2012-06-21 23:38 1490继上一篇LOG4J一些工作中的学习总结之后,今天我在程序调试过 ... -
LOG4J一些工作中的学习总结
2012-06-20 12:19 1170首先声明:我这里使用的是apache的log4j日志框 ... -
转载:oschina网站的架构
2012-06-13 13:20 1483OsChina.NET 这个域名是在2008年8月16日申请的 ... -
转载:JFREECHART初级教程
2012-05-20 00:21 941JFreeChart是一组功能强大、灵活易用的Java绘图AP ... -
JS用open方法传中文乱码的解决方案,经测试,有效
2010-11-30 17:11 1288首先,在前台调用open打开对话框的位置,对要传值的中 ... -
JDK1.6存在一个方法错误,大家一起来交流下
2010-09-03 15:49 928今天在公司做项目时,用到这么一个功能:需要批量执行一些 ... -
JAVA多线程的探讨(收藏)
2010-08-07 22:30 982探索并发编程(一)------操作系统篇 探索并发编程(二) ... -
Ibatis初学的一个例子,新手可以尽快上手。
2010-06-25 17:28 1373IBATIS是优秀的半ORM框架,原先一直在用HIBE ...
相关推荐
Spring的面向切面编程(AOP)可以与RMI集成,提供日志记录、性能监控、安全控制等功能。通过定义切点和通知,可以在RMI调用前后执行特定逻辑。 ### 5. Spring RMI优化 - **RMI超时设置**:可以配置RMI连接和操作的...
在这个"Spring RMI小例子"中,我们将深入理解Spring如何简化RMI的使用,以及如何通过它实现跨网络的交互。 首先,RMI允许Java对象在不同的JVM之间进行通信,仿佛它们都在同一个进程中运行。Spring通过提供自动注册...
Spring Remote Method Invocation(RMI)是Java平台上的一个远程对象调用框架,它允许一个Java对象在一台机器上执行,并且被另一台机器上的客户端调用。在这个"SpringRMI小例子"中,我们将深入探讨如何利用Spring...
在描述中提到的博文中,作者可能详细介绍了如何设置和使用Spring RMI。通常,这包括以下几个步骤: 1. **创建远程接口**:首先,你需要定义一个Java接口,这个接口将被实现并作为远程服务的合同。接口中的方法会被...
为了避免业务逻辑重新开发,顾使用spring rmi,把所有的bean作为rmi服务暴漏出来,在客户端只需要把项目依赖过来就ok,或者把以前的接口导入过来。 参考文档:...
### Spring RMI 使用详解 #### 一、Spring RMI 概述 Spring RMI 是 Spring 框架中用于支持远程方法调用(Remote Method Invocation)的功能模块。通过 Spring RMI, 开发者能够更加简便地搭建和管理远程服务。传统上...
在本示例中,我们将探讨如何使用Spring RMI创建一个小的应用程序,这通常涉及到服务器端(服务提供者)和客户端(服务消费者)的设置。 首先,让我们了解Spring RMI的核心概念: 1. **接口定义**:在RMI中,我们...
要实现Spring RMI,我们需要以下组件: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,必须继承自`java.rmi.Remote`。例如: ```java public interface MyRemoteService extends Remote { String...
5. **客户端代码**:使用Spring的`RmiProxyFactoryBean`或`JndiObjectFactoryBean`来查找和代理RMI服务的代码,进行远程调用。 6. **测试类**:可能包含单元测试或集成测试,验证RMI服务的正确性和性能。 通过分析...
可以使用Spring Boot Actuator或自定义监控工具来收集这些指标,并根据实际情况调整线程池的参数。 通过以上改造,我们实现了对Spring RMI服务的优化,有效控制了并发处理的线程数量,提高了系统资源的利用率,同时...
在本文中,我们将深入探讨Spring框架如何集成RMI,以及如何创建和使用RMI客户端。 首先,让我们了解RMI的基本概念。RMI是一种机制,它允许一个对象在一台计算机上执行的方法可以在另一台计算机上执行,就好像这些...
- `zrmiservice`:服务端代码通常位于这个目录下,包含RMI服务的实现、Spring配置文件以及启动服务器的脚本。 - `rmi-lib`:RMI运行所需的库文件。 - `zrmientry`:可能是一个主入口类或者脚本,用于启动整个RMI系统...
在Spring框架的支持下,我们可以更方便地将服务发布为RMI服务,使得其他应用程序可以跨JVM(Java Virtual Machine)访问这些服务。下面将详细阐述Spring RMI服务的实现原理、配置过程以及如何自动化发布服务。 首先...
Spring RMI(Remote Method Invocation)是Spring框架对Java RMI技术的一种封装,使得在Spring环境中使用RMI变得更加简便。RMI是一种Java平台上的远程对象调用机制,它允许一个Java对象在不同的Java虚拟机之间调用另...
1.2 Spring的RMI支持:Spring通过`org.springframework.remoting.rmi.RmiServiceExporter`和`RmiProxyFactoryBean`简化了RMI的使用。`RmiServiceExporter`用于发布服务,而`RmiProxyFactoryBean`则用于创建RMI服务的...
当我们谈论“RMI与Spring整合实例”时,我们通常是指将RMI技术与Spring框架结合使用,以便构建可扩展的、分布式的Java应用程序。下面将详细解释这两个概念以及如何将它们整合在一起。 1. RMI基础: - RMI的核心...
- **安全考虑**:在Web环境中,必须考虑到安全性问题,例如使用Spring Security来保护RMI接口,防止未经授权的访问。 - **负载均衡**:在大型分布式系统中,可能有多台服务器提供RMI服务。Spring可以配合负载均衡...
本压缩包提供了两个Java工程示例,帮助开发者了解如何在Spring环境中集成并使用RMI。 首先,让我们理解RMI的基本概念。RMI是Java提供的一种机制,使得一个Java对象能够调用运行在不同JVM上的另一个Java对象的方法。...
通过这种方式,你可以轻松地在Java项目中使用Spring RMI,实现分布式系统中的远程服务调用。同时,Spring框架提供的事务管理、AOP(面向切面编程)等功能也可以与RMI无缝集成,进一步增强系统的可维护性和扩展性。在...