spirng整合rmi
package com.rmi;
/**
* 接口
* @author edgewalk
* @date 2017年6月11日
*/
public interface RmiServer {
public boolean test();
}
package com.rmi.impl;
import com.rmi.RmiServer;
/**
* 实现类
* @author edgewalk
* @date 2017年6月11日
*/
public class RmiServerImpl implements RmiServer {
@Override
public boolean test() {
System.out.println("服务端test方法执行了.....");
return true;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.5//EN" "file:/usr/local/tomcat_report/lib/spring-beans-2.0.dtd">
<beans>
<!-- 定义接口实现类-->
<bean id="rmiService" class="com.rmi.impl.RmiServerImpl"/>
<bean id="remoteRmiService" class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- service接口 -->
<property name="serviceInterface" value="com.rmi.RmiServer"/>
<!-- 调用Service -->
<property name="service" ref="rmiService" />
<!-- value值是提供给客户端调用 -->
<property name="serviceName" value="remoteService"/>
<!-- 注册端口 -->
<property name="registryPort" value="9400"/>
<!-- 服务端口 -->
<property name="servicePort" value="9401"/>
</bean>
</beans>
package com.rmi;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 服务端启动类
* @author edgewalk
* @date 2017年6月11日
*/
public class MainServer {
public static void main(String[] args) {
System.out.println("rmi服务端启动...");
ApplicationContext ac = new ClassPathXmlApplicationContext("rmi-server.xml");
System.out.println("rmi服务端启动完成...");
}
}
package com.rmi;
/**
* 在客户端使用服务端的接口文件
* @author edgewalk
* @date 2017年6月11日
*/
public interface RmiServer {
public boolean test();
}
package com.rmi;
import java.io.IOException;
import java.net.Socket;
import java.rmi.server.RMIClientSocketFactory;
/**
* 自定义的socket连接工厂
*
* @author edgewalk
* @date 2017年6月11日
*/
public class RMICustomClientSocketFactory implements RMIClientSocketFactory {
private int timeout = 1000; // 读超时时间
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public Socket createSocket(String host, int port) throws IOException {
Socket socket = new Socket(host, port);
/**
* 调用setSoTimeout(int
* timeout)可以设置超时时间,如果到了超时时间仍没有数据,read会抛出一个SocketTimeoutException,
* 程序需要捕获这个异常,但是当前的socket连接仍然是有效的。
*/
socket.setSoTimeout(timeout);
return socket;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.5//EN" "file:/usr/local/tomcat_report/lib/spring-beans-2.0.dtd">
<beans>
<!-- 自定一个SCOKECT连接,可配置读超时时间 -->
<bean id="rmiClientSocketFactory" class="com.rmi.RMICustomClientSocketFactory">
<property name="timeout" value="1000"></property>
</bean>
<!-- rmi远程调用 -->
<bean id="clientRmiService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<!-- rmiServer是调用服务端serviceName的value,rmiIp是服务端ip,rmiPort是服务端注册的端口 -->
<property name="serviceUrl" value="rmi://127.0.0.1:9400/remoteService" />
<!-- service接口 -->
<property name="serviceInterface" value="com.rmi.RmiServer" />
<!-- 客户端自动重连 -->
<!-- lookupStubOnStartup : false表示,不在容器启动的时候创建与Server端的连接; -->
<property name="lookupStubOnStartup" value="true" />
<!-- refreshStubOnConnectFailure : 这个属性是表示是否连接出错时自动重连; -->
<property name="refreshStubOnConnectFailure" value="true" />
<!-- registryClientSocketFactory : 这个是客户端与服务端创建SOCKECT的一个工厂。 -->
<property name="registryClientSocketFactory" ref="rmiClientSocketFactory" />
</bean>
</beans>
package com.rmi.client;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.rmi.RmiServer;
/**
* 客户端测试调用服务端程序
* @author edgewalk
* @date 2017年6月11日
*/
public class TestRmi {
public static void main(String[] arg) {
System.out.println("rmi客户端开始调用...");
ApplicationContext ctx = new ClassPathXmlApplicationContext("rmi-client.xml");
RmiServer rmi=(RmiServer)ctx.getBean("clientRmiService");
//rmi.test();
System.out.println("rmi客户端调用完成...");
}
}
rmi服务端启动...
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
rmi服务端启动完成...
服务端test方法执行了.....
rmi客户端开始调用...
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
rmi客户端调用完成...
spirng整合rmi的更多相关文章
- Spring 4 整合RMI技术及发布多个服务(xjl456852原创)
rmi需要建立两个项目,一个是服务端的项目,一个是客户端的项目.服务端项目启动后,再启动客户端项目去调用服务端的方法. 我们建立两个maven项目: pom.xml配置: <?xml versi ...
- SSH三大框架整合案例
SSH三大框架的整合 SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 ...
- SSH三大框架的整合
SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate ...
- spring RMI的使用
Spring整合RMI的原理 客户端的核心是RmiProxyFactoryBean,包含serviceURL属性和serviceInterface属性. 通过JRMP访问服务.JRMP JRMP:ja ...
- 20160526-20160531mybatis入门进阶
mybatis第二天 高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一人持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...
- Ehcache缓存配置以及基本使用
在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中取出来的高花费.高延迟采取的一种缓存方案.正因为Ehcache具有健壮性(基于java开发).被认证(具有apache 2.0 ...
- spring远程服务知识梳理
序:本文主要是总结和归纳spring的远程服务相关知识,可作为入门学习笔记.写博客目的也是为了进行知识梳理,便于以后查看.本文主要参考资料 spring 实战第三版 本文主要讨论内容如下: 远程调度概 ...
- mybatis由浅入深day02_课程复习_1订单商品数据模型分析
mybatis第二天 高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一个持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...
- java学习摘抄笔记mybaits2
mybatis第二天 高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一人持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...
随机推荐
- 牛客网暑期ACM多校训练营(第一场):D-Two Graphs
链接:D-Two Graphs 题意:给出图G1和G2,求G2的子图中和G1同构的个数. 题解:只有8个点,暴力枚举G2的点每个排列,让G1映射到G2中,求出同构个数a.同构的G2就是在G1有边的对应 ...
- leetcode 174. 地下城游戏 解题报告
leetcode 174. 地下城游戏 一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下 ...
- HDU 4750 Count The Pairs (离线并查集)
按边从小到大排序. 对于每条边(from, to, dist),如果from和to在同一个集合中,那么这条边无意义,因为之前肯定有比它更小的边连接了from和to. 如果from和to不属于同一个集合 ...
- flutter channel master
flutter可能是未来跨平台开发的又一技术框架,那么对于一个app,我们不可能完全用flutter来开发,那么就意味着我们需要在已有的Android和iOS代码中去集成flutter.目前这一技术还 ...
- 洛谷 最小费用最大流 模板 P3381
#include<cstdio> #include<algorithm> #include<cstring> #include<queue> #defi ...
- 洛谷 P4883 mzf的考验 解题报告
P4883 mzf的考验 题目背景 \(mzf\)立志要成为一个豪杰,当然,他也是一个\(OIer\). 他希望自己除了会\(OI\)之外还会各种东西,比如心理学.吉他.把妹等等. 为了让自己有更大的 ...
- 《c程序设计语言》-2.10 不用if-else 转换大小写
#include <stdio.h> int lower(char a) { int b; b = (a >= 'A' && a <= 'Z') ? (a - ...
- AI人工客服开发 小程序智能客服 智能客服微信小程序 智能客服系统怎么做 如何设计智能客服系统
今天我们就来给大家分享下如何做 小程序的智能客服问答系统. 首先请确保你的小程序在线客服已经开通使用,并使用代码自己对接好了,将客户的提问自动做了拦截,拦截到了你自己开发的接口上. 做好了拦截以后,我 ...
- hdu 4359 dp
/* 题目大意:给n个节点的二叉树第i个节点的权值为2^(i-1), 求所有含左右子树的节点都符合左子树的权和小于右子树权和的种数. */ #include <iostream> #inc ...
- .ini配置CAN信息
#include <iostream> #include <windows.h>//这个头文件一定要添加,否则GetPrivateProfileString(...)函数无法使 ...