在使用Spring RMI时可能会遇到发布多个服务的需求,假设一个服务要操作文件,另一个服务要往屏幕上打印“hello world”。难道要把这两个风马牛不相及的服务写在一个接口里吗!如果真这样那结构也太差了。
网上有人问这个问题:“http://topic.csdn.net/u/20090702/11/9bcf60e5-f3f8-4401-a41d-2f98535988b9.html”,看样子这个问题难住了一些人,因为他们想在一个serviceName里面发布多个serviceInterface。其实转换个思维也就不会被难倒了。倘若在一个serviceName里面发布多个serviceInterface,那么service又该怎么配呢,难道用个list将serviceInterface和service对应起来?显然是行不通的。
解决办法很简单:配置多个RmiServiceExporter的bean,使不同的服务(属性:service)用不同的服务名(属性:serviceName)和接口(属性:serviceInterface)。给个demo就更清晰了:
1: <bean id="oper1" class="***.Oper1"></bean>
2: <bean id="rmiService_oper1" class="org.springframework.remoting.rmi.RmiServiceExporter">
3: <property name="serviceName">
4: <value>oper1</value>
5: </property>
6: <property name="service">
7: <ref local="oper1" />
8: </property>
9: <property name="serviceInterface">
10: <value>***.IOper1</value>
11: </property>
12: <property name="registryPort">
13: <value>9990</value>
14: </property>
15: </bean>
16:
17: <bean id="oper2" class="***.Oper2"></bean>
18: <bean id="rmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">
19: <property name="serviceName">
20: <value>oper2</value>
21: </property>
22: <property name="service">
23: <ref local="oper2" />
24: </property>
25: <property name="serviceInterface">
26: <value>***.IOper2</value>
27: </property>
28: <property name="registryPort">
29: <value>9990</value>
30: </property>
31: </bean>
service、serviceName和serviceInterface都不一样,端口可以相同。
客户端的配置也很简单了:
1: <bean id="rmiClient_oper1" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
2: <property name="serviceUrl">
3: <value>rmi://192.168.0.***:9990/oper1</value>
4: </property>
5: <property name="serviceInterface">
6: <value>***.IOper1</value>
7: </property>
8: </bean>
9: <bean id="rmiClient_oper2" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
10: <property name="serviceUrl">
11: <value>rmi://192.168.0.***:9990/oper2</value>
12: </property>
13: <property name="serviceInterface">
14: <value>***.IOper2</value>
15: </property>
16: </bean>
main里运行:
1: public static void main(String[] args) {
2: ApplicationContext ctx = new ClassPathXmlApplicationContext(
3: "applicationContext-client.xml");
4: IOper1 o1 = (IOper1) ctx.getBean("rmiClient_oper1");
5: o1.exeuteFile();
6:
7: IOper2 o2 = (IOper2) ctx.getBean("rmiClient_oper2");
8: o2.printHelloWorld();
9: }
这主要是个思路问题,没什么巧的。
分享到:
相关推荐
9. **并行计算**:RMI使得在多个处理器或计算机上并行执行任务成为可能。 创建RMI接口的步骤如下: 1. **定义接口**:创建一个接口,并让它继承`java.rmi.Remote`。接口中定义的每个方法都需要抛出`java.rmi....
在分布式环境中,利用RMI计算斐波那契数列可以展示如何在多个节点间分配任务,提高计算效率。 RMI的工作原理包括以下步骤: 1. **定义远程接口**:首先,你需要定义一个Java接口,该接口声明了将在远程对象上调用...
总的来说,Java RMI和CORBA是两种强大的分布式计算工具,它们允许开发者构建跨越多个计算机的复杂系统。理解它们的工作原理和使用方式对于提升Java程序员在分布式环境下的编程能力至关重要。通过学习这些技术,...
在JDK5之前,使用RMI是一项相对复杂的工作,涉及到多个步骤,包括定义远程接口、编写服务端和客户端代码、生成Stub和Skeleton等。这些繁琐的操作使得许多开发者转而寻求其他解决方案,如使用EJB作为一种对RMI的封装...
本文将从系统接口设计的多个方面进行讲解,包括系统接口标准、交换标准、Web 服务标准、业务流程标准、数据交换安全、数据交换标准等。 系统接口标准是指系统对接方式的核心标准,本文采用 SOA 体系架构,通过服务...
文档的最后部分提到了一些特定的商标信息,这些商标受到美国政府的FAR和DFAR条款的限制,同时也在美国和其他国家注册,如UNIX、Sun Microsystems的标志以及Java相关的多个商标。这些条款和声明主要是为了说明文档和...
源代码包提供了一个菜单驱动的配置接口,允许用户进行默认构建配置。 ### 3.2 构建过程 1. **下载源代码**:从指定的网站下载AutoBoot的源代码包。 2. **配置构建环境**: - 确保安装了适当的工具链,例如用于...
| 返回值 | 单个对象或集合 | 单个或多个对象 | | 声明位置 | Home接口 | Bean类 | | 方法名 | FindXxx() | EjbSelectXxx() | | 可见度 | 客户端可见 | Bean类内部可见 | #### 七、主接口与组件接口的区别 - **主...
总结,Dubbo的服务发布与服务引用涉及配置解析、服务暴露、注册中心交互、服务发现、负载均衡以及远程调用等多个环节。通过对源码的深入分析,我们可以更清晰地了解这些流程,从而更好地理解和优化Dubbo的应用。
在系统设计时,将数据库监测系统分为多个子系统,包括中间层服务器程序、浏览器、HTTP/HTTPS请求响应处理、Web容器、业务逻辑层、JDBC访问Bean等。这些子系统通过消息发布/订阅或者远程方法调用来实现通信和数据交换...
随着公司规模的不断扩大,他们面临着越来越多的管理挑战,尤其是在多个办公室之间协调工作时。为了提高效率并解决这些问题,他们决定采用分布式计算技术。 ### 分布式解决方案 #### 分布式办公环境的问题 随着...
- 需要注意的是,如果在同一台机器上有多个Tomcat实例,则需要配置不同的端口号来避免冲突。 ##### 4. 添加依赖 - 这是创建WebService接口的重要一步。 - 添加必要的WebService库,例如Apache CXF或Spring Web...
- **集群(Cluster)**:对多个服务提供者的实例进行管理和负载均衡,隐藏服务列表的细节。 - **路由(Router)**:根据一定的规则筛选服务提供者,实现动态路由策略。 四、配置与实践 Dubbo的使用通常涉及到以下...
4. **Cluster层:** 负责多个服务提供者的负载均衡和容错处理,如Failover、Failfast、Failsafe、Fallback等策略。 5. **Registry层:** 处理服务的注册和订阅,维护服务提供者和消费者之间的关系。 6. **Protocol层...
7. **负载均衡(Load Balancing)**:如果服务提供者有多个实例,Dubbo提供了多种负载均衡策略,如随机、轮询、最少活跃调用数等,用于在多个实例间分配请求,提高系统可用性。 8. **容错机制(Fault Tolerance)**...
1. **服务拆分**:服务拆分的目标是将大而全的单体应用分解为多个小而美的服务,每个服务专注于特定的业务领域。在描述中提到的拆分方式包括Web、Service、Facade、Parent和Common等工程服务。这代表了以下几种常见...
RMI简化了多台计算机间的通信,使得开发者无需深入理解底层网络细节就能实现跨机器的对象交互。 RMI的核心概念包括: 1. **远程接口(Remote Interface)**:所有可以被远程调用的对象都必须实现`java.rmi.Remote`...
4. **微服务架构**:在微服务架构中,Dubbo可以帮助拆分大型系统为多个小型、独立的服务,每个服务都可以独立部署、扩展,降低了系统的复杂性。 5. **集成Spring Boot**:Dubbo可以无缝集成Spring Boot,利用Spring...