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