Java RMI 使用例子
1.创建协议接口(UserService)
/**
*
*/
package com.junge.demo.rmi.protocol.service; import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException; import com.junge.demo.rmi.protocol.model.User; /**
* @author Administrator
*
*/
public interface UserService extends Remote, Serializable { Integer addUser(User user) throws RemoteException; void delUser(Integer userid) throws RemoteException; void modifyUser(User user) throws RemoteException; User getUserByUserId(Integer userid) throws RemoteException;
}
User.java
/**
*
*/
package com.junge.demo.rmi.protocol.model; import java.io.Serializable; /**
* @author Administrator
*
*/
public class User implements Serializable { /**
*
*/
private static final long serialVersionUID = -8967262939434460765L; private Integer userid;
private String username; public Integer getUserid() {
return userid;
} public void setUserid(Integer userid) {
this.userid = userid;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} @Override
public String toString() {
return "User [userid=" + userid + ", username=" + username + "]";
}
}
2、创建服务实现类UserServiceProvider.java
package com.junge.demo.rmi.server.service.provider; import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; import com.junge.demo.rmi.protocol.model.User;
import com.junge.demo.rmi.protocol.service.UserService; public class UserServiceProvider extends UnicastRemoteObject implements UserService {
/**
*
*/
private static final long serialVersionUID = 1L; public UserServiceProvider() throws RemoteException {
super();
} public Integer addUser(User user) throws RemoteException {
System.out.println("addUser:" + user);
return user.getUserid();
} public void delUser(Integer userid) throws RemoteException {
System.out.println("delUser,userid=" + userid); } public void modifyUser(User user) throws RemoteException {
System.out.println("modifyUser:" + user); } public User getUserByUserId(Integer userid) throws RemoteException {
System.out.println("getUserByUserId,userid={}" + userid); User user = new User();
user.setUserid(userid);
user.setUsername("寮犱笁");
return user;
}
}
3.启动注册表,注册服务(ServiceStartServlet.java)
/**
*
*/
package com.junge.demo.rmi.server.service.start; import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import com.alibaba.fastjson.JSONObject;
import com.junge.demo.rmi.server.service.provider.UserServiceProvider; /**
* @author Administrator
*
*/
public class ServiceStartServlet extends HttpServlet { private static final long serialVersionUID = 1L; private Registry registry; private static final String BIND_NAME = "com.junge.demo.rmi.protocol.service.UserService"; private Registry getRegistry() throws RemoteException {
return LocateRegistry.createRegistry(1099);
} @Override
public void init() throws ServletException { try {
registry = getRegistry();
System.out.println(JSONObject.toJSON(registry.list()));
registry.rebind(BIND_NAME, new UserServiceProvider()); } catch (RemoteException e) {
e.printStackTrace();
}
} @Override
public void destroy() {
if (null != registry) {
try {
registry.unbind(BIND_NAME);
} catch (Exception e) {
e.printStackTrace();
}
}
} }
4.创建客户端调用rmi(RmiClient.java)
/**
*
*/
package com.junge.demo.rmi; import java.rmi.Naming;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import com.junge.demo.rmi.protocol.model.User;
import com.junge.demo.rmi.protocol.service.UserService; /**
* @author Administrator
*
*/
public class RmiClient { /**
* @param args
*/
public static void main(String[] args) {
addUserBatch(); } public static void addUserBatch() { Long btime = System.currentTimeMillis(); ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 1000, 200L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000)); try {
UserService userService = (UserService)Naming.lookup("com.junge.demo.rmi.protocol.service.UserService");
for (int i = 0; i < 50000; i++) {
executor.submit(new OperUser(userService));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
executor.shutdown();
} Long etime = System.currentTimeMillis(); System.out.println(etime - btime);
} } class OperUser implements Runnable {
private UserService userService; public OperUser(UserService userService) {
this.userService = userService;
} @Override
public void run() {
try {
// 增加、详情、修改、删除
User user = new User();
user.setUserid(1);
user.setUsername("名字");
userService.addUser(user); User user2 = userService.getUserByUserId(1); userService.modifyUser(user2); userService.delUser(user2.getUserid());
} catch (Exception e) {
e.printStackTrace();
} }
}
5.注意实现
a.协议接口需要继承Remote接口,对外提供的接口需要抛出RemoteException异常
b.协议接口中使用的对象需要实现序列化接口Serializable
c.服务端实现类需要继承UnicastRemoteObject类
6.问题
1.使用maven工程创建的服务端,直接使用java application运行服务端,找不到协议接口
Java RMI 使用例子的更多相关文章
- Java RMI简单例子HelloWorld
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...
- JAVA RMI例子
RMI 是java语言的一个RPC框架,本文给出基础例子如下: 1.实现接口: public interface ICalc extends Remote { public int add(int p ...
- Java RMI 介绍和例子以及Spring对RMI支持的实际应用实例
RMI 相关知识 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网 ...
- Java RMI之HelloWorld篇
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...
- java.rmi.NoSuchObjectException: no such object in table
jmx链接的时候,最简单的例子都行不通,郁闷,出现了: 参考:http://reiz6153.blog.163.com/blog/static/401089152009442723208/ 代码: M ...
- Java学习笔记(十六)——Java RMI
[前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...
- JAVA RMI helloworld入门
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...
- Java RMI 远程方法调用
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...
- java rmi 小记
最近在搞Quartz任务监控管理,碰到了jmx,后来发现Quartz对jmx的支持不是很好,介绍的文档也比较少,另外Quartz可以很方便的支持rmi于是就看了一下rmi.下面把写的一些测试小例子附上 ...
随机推荐
- C#对接JAVA系统遇到的AES加密坑
起因对接合作伙伴的系统,需要对数据进行AES加密 默认的使用了已经写好的帮助类中加密算法,发现结果不对,各种尝试改变加密模式改变向量等等折腾快一下午.最后网上查了下AES在JAVA里面的实现完整代码如 ...
- laravel PHPExcel 使用小结
最近需求要用到PHPExcel,laravel框架中有相应的组件https://github.com/Maatwebsite/Laravel-Excel,我用的是2.1的(3.0文档不详细而且坑似乎也 ...
- 解决no module named ipykernel_launcher
解决no module named ipykernel_launcher 最近开hydrogen的时候,提示no module named ipykernel_launcher. 记得以前解决过这个问 ...
- 《Spring_Four》第二次作业 基于Jsoup的大学生考试信息展示系统开题报告
一.项目概述 该项目拟采用Jsoup对大学生三大考试(考研.考公务员.考教师资格证)进行消息搜集,研发完成一款轻量级的信息展示APP,本项目主要的创新点在于可以搜集大量的考试信息,对其进行一个展示,而 ...
- rpm包安装的nginx热升级
文章目录一.本地环境基本介绍二.yum升级命令说明三.升级好nginx后如何不中断业务切换3.1.nginx相关的信号说明3.2.在线热升级nginx可执行文件程序一.本地环境基本介绍本次测试环境,是 ...
- 最小费用最大流 HDU1533
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1533 #include<bits/stdc++.h> #define fi first ...
- python生成器(generator)、迭代器(iterator)、可迭代对象(iterable)区别
三者联系 迭代器(iterator)是一个更抽象的概念,任何对象,如果它的类有next方法(next python3)和__iter__方法返回自己本身,即为迭代器 通常生成器是通过调用一个或多个yi ...
- localStorage,sessionStorage,cookie使用场景和区别
localStorage:HTML5新增的在浏览器端存储数据的方法.设置和获取localStorage的方法: 设置: localStorage.name = 'zjj'; 获取: localStor ...
- input type="file"多图片上传 原生html传递的数组集合
单个的input type="file"表单也是可以实现多图片上传的 代码如下: <form action="manypic.php" method=&q ...
- React-router4 第五篇 Preventing Transitions 防止转换
文档地址:https://reacttraining.com/react-router/web/example/preventing-transitions 大概意思就是说:我在这个页面上写东西呢?不 ...