Java RMI 代码详解

  1. 概念:
    1. Java 远程方法调用 (RMI) 系统允许在一个 Java 虚拟机中运行的对象调用在另一个 Java 虚拟机中运行的对象上的方法。RMI 提供用 Java 编程语言编写的程序之间的远程通信。
    2. RMI 应用程序通常包括两个独立的程序,一个服务器和一个客户端。典型的服务器程序创建一些远程对象,使这些对象的引用可访问,并等待客户端调用这些对象上的方法。典型的客户端程序获取对服务器上一个或多个远程对象的远程引用,然后调用它们的方法。RMI 提供了服务器和客户端通信和来回传递信息的机制。这种应用程序有时被称为分布式对象应用程序
    3. 分布式对象应用需要做到以下几点:
      1. 定位远程对象。应用程序可以使用各种机制来获取对远程对象的引用。例如,应用程序可以使用 RMI 的简单命名工具 RMI 注册表注册其远程对象。或者,应用程序可以传递和返回远程对象引用作为其他远程调用的一部分。
      2. 与远程对象通信。远程对象之间的通信细节由 RMI 处理。对于程序员来说,远程通信看起来类似于常规的 Java 方法调用。
      3. 为传递的对象加载类定义。因为 RMI 使对象能够来回传递,所以它提供了加载对象的类定义以及传输对象数据的机制。
  2. 下图描述了一个 RMI 分布式应用程序,它使用 RMI 注册表来获取对远程对象的引用。服务器调用注册表以将名称与远程对象关联(或绑定)。客户端在服务器的注册表中通过名称查找远程对象,然后调用它的方法。该图还显示 RMI 系统使用现有的 Web 服务器在需要时为对象加载类定义,从服务器到客户端,从客户端到服务器。
  3. 下面附上Java代码(下面读取es中的数据存到List集合中,发布到server端,client端通过id字段来读取对应的数据)
package com.wei.rmi;

//服务端 直接使用registry实现rmi

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class RegistryService {
    public static void main(String[] args) {

        //本地主机上的远程对象注册表Registry的实例,默认端口1099
        try {
            Registry registry = LocateRegistry.createRegistry(4755);

            //创建一个远程对象
            HelloRegistryFacadeImpl hello = new HelloRegistryFacadeImpl();

            //把远程对象注册到rmi注册服务器上, 并命名为HelloRegistry
            registry.rebind("HelloRegistry", hello);
            System.out.println("=============启动rmi服务成功=============");
        } catch (Exception e1) {
            e1.printStackTrace();

        }
    }

}
package com.wei.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.ArrayList;

public interface HelloRegistryFacade extends Remote {

    public ArrayList<User> getIndexElements(int id)throws RemoteException;
}
package com.wei.rmi;

import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;

public class HelloRegistryFacadeImpl extends UnicastRemoteObject implements HelloRegistryFacade {

    public HelloRegistryFacadeImpl() throws RemoteException {
        super();
    }

    @Override
    public ArrayList<User> getIndexElements(int id) {
        RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.45.10", 9200,
                "http")));


        //1.请求体查询 查找所有索引
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("user3");

        //构建查询的请求体
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //查询所有数据
        sourceBuilder.query(QueryBuilders.matchAllQuery());
        searchRequest.source(sourceBuilder);

        SearchResponse response = null;
        try {
            response = client.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ArrayList<User> arrayList = new ArrayList<>();
        // 查询匹配
        SearchHits hits = response.getHits();
        for (SearchHit hit : hits) {
            User user = new User();
            //输出每条查询的结果信息
            String asString = hit.getSourceAsString();
            String[] strings = asString.split(",");//
            for (String string : strings) {//string[] = {"id":1 | "name":"李四" | "age":22}

                String[] split = string.split(":");
                if (string.contains("id")) {
                    user.setId(Integer.parseInt(split[1]));
                } else if (string.contains("name")) {
                    user.setName(split[1].replace("\"", ""));
                } else if (string.contains("age")) {
                    user.setAge(Integer.parseInt(split[1].replace("}", "")));
                }
            }
                arrayList.add(user);

        }


        for (int i = 0; i < arrayList.size(); i++) {

            if (id == arrayList.get(i).getId()) {
                System.out.println("匹配到id=" + id + "的数据:");
                System.out.println(arrayList.get(i));
            }
        }
        return arrayList;
    }
}
package com.wei.rmi;

import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;

public class RegistryClient {
    public static void main(String[] args) {
        try {
            Registry registry = LocateRegistry.getRegistry(4755);

            HelloRegistryFacade hello = (HelloRegistryFacade)registry.lookup("HelloRegistry");

            int id = 2;
            ArrayList<User> response = hello.getIndexElements(id);

            System.out.println("===============response:"+response.get(id-1)+"================");


        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        }
    }
}
package com.wei.rmi;

import java.io.Serializable;

public class User implements Serializable {
    private int id;
    private String name;
    private int age;

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public User() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>es-test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.8.0</version>
    </dependency>
    <!-- elasticsearch 的客户端 -->
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.8.0</version>
    </dependency>
    <!-- elasticsearch 依赖 2.x 的 log4j -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.9</version>
    </dependency>
    <!-- junit 单元测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

</project>

Guess you like

Origin blog.csdn.net/qq_45648512/article/details/118574370