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运行服务端,找不到协议接口

相关推荐