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 使用例子的更多相关文章

  1. Java RMI简单例子HelloWorld

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  2. JAVA RMI例子

    RMI 是java语言的一个RPC框架,本文给出基础例子如下: 1.实现接口: public interface ICalc extends Remote { public int add(int p ...

  3. Java RMI 介绍和例子以及Spring对RMI支持的实际应用实例

    RMI 相关知识 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网 ...

  4. Java RMI之HelloWorld篇

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  5. java.rmi.NoSuchObjectException: no such object in table

    jmx链接的时候,最简单的例子都行不通,郁闷,出现了: 参考:http://reiz6153.blog.163.com/blog/static/401089152009442723208/ 代码: M ...

  6. Java学习笔记(十六)——Java RMI

    [前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...

  7. JAVA RMI helloworld入门

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  8. Java RMI 远程方法调用

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  9. java rmi 小记

    最近在搞Quartz任务监控管理,碰到了jmx,后来发现Quartz对jmx的支持不是很好,介绍的文档也比较少,另外Quartz可以很方便的支持rmi于是就看了一下rmi.下面把写的一些测试小例子附上 ...

随机推荐

  1. OpenCV使用BGR而非RGB格式

    日常开发和交流时,我们习惯将图片的颜色通道按照RGB(red, green, blue)进行排列.闲来无聊,在把玩卷积神经网络模型时发现OpenCV并没有按照这个顺序读入图片.好奇地搜索一下OpenC ...

  2. gentoo ebuild 私人portage

    最近考虑搞个私人 portage, 用于一些软件的安装和管理. mkdir -p /usr/local/portage/app-misc/hello-world cd $_ cp /usr/porta ...

  3. oracle 创建表,删除表,修改表,查询表

    1,获取当前用户下的所有表信息 =>  SELECT * FROM user_tables 1.1,查询某一张表的字段信息:SELECT  *  FROM user_tab_columns  w ...

  4. setDaemon 守护线程

    setDaemon(True): 将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起.这个方法基本和join是相反的. 当我们 在程序运行中,执行一个 ...

  5. @ResponseBody 与 response.getWriter.write

    @responseBody注解的使用 1. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通 ...

  6. 请求不同域的数据方法:requests Jsonp cors

    在需要访问不同域的接口的数据的时候,一般有两种方式: 第一种: 使用requests模块,在业务逻辑中直接访问别的域的接口,获取数据,然后将返回的数据显示到前端页面上; 这个时候,数据访问的流程是: ...

  7. elasticsearch数据结构

    无论是关系型数据库还是非关系型数据库,乃至elasticsearch这种事实上承担着一定储存作用的搜索引擎,数据类型都是非常重要而基础的概念.本文基于elasticsearch 5.x版本. 核心数据 ...

  8. Linux - 操作系统

    操作系统(科普章节) 目标 了解操作系统及作用 1. 操作系统(Operation System,OS) 操作系统作为接口的示意图 没有安装操作系统的计算机,通常被称为 裸机 如果想在 裸机 上运行自 ...

  9. c++ 面试题(网络类)

    1,若服务器方单独终止之后,客户端继续发数据会怎么样? https://blog.csdn.net/Nick_666/article/details/78342442 https://www.zhih ...

  10. map与forEach区别

    1.  forEach()返回的是undefined 不可以链式调用 return没有用 2. map()返回一个新数组 原数组不会改 3. 没办法终止或者跳过forEach()和map循环  除非抛 ...