我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java调用elasticsearch本地代码的操作方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java调用elasticsearch本地代码的操作方法

虽然Java虚拟机为开发人员屏蔽了底层的实现细节,使得开发人员不用考虑底层操作系统的差异性。不过在某些应用程序中,还是免不了要直接与底层操作系统上的原生代码进行交互。今天我们就来看一下Java对本地调用提供的支持。

一、为什么要进行本地调用

1.基于性能的考虑

Java语言从其运行速度上来说,在大多数方面是慢于底层操作系统上原生的C和C++等语言的。这主要是由于Java虚拟机这个中间层次的存在。如果完全用Java语言实现的性能无法达到程序的预期要求,可以选择把部分重要且耗时的代码用C或C++来实现。

2.基于某些特殊的需求

Java平台提供的标准类库的功能很强大,包括了在开发中可能遇到的大部分功能。但是仍然有一些功能无法用标准API来实现,主要是一些与底层硬件平台直接交互的功能。Java虚拟机没有把这一部分功能暴露给运行在其上的程序。如果需要这方面的功能,那么只能使用原生代码来进行开发。

3.与已有的使用原生代码编写的程序之间进行集成。

如果Java程序需要与底层操作系统上由C和C++语言开发的程序进行交互,那么可以进行本地调用。

我们平时的开发更多的情况是后边两种情况;在elasticsearch中基本上是属于第二种情况。

二、使用JNI实现本地调用

针对以上提到的各种情况,Java提供了JNI(Java Native Interface)和JNA(Java Native Access)两种方式,其中JNI的一个重要使用场景是提高程序的性能。当对程序中关键部分的性能要求比较高的时候,可以使用C和C++代码来实现。

我们先来看下怎么使用JNI来进行本地调用。

首先我们需要有一个Java类来声明本地方法,并负责加载本地代码库。本地方法与Java接口中的方法或抽象类中的抽象方法一样,只包含方法声明,没有相关的实现。程序中的其他部分可以用正常的方法调用本地方法,比如参数传递和返回值使用等都与正常的方法相同。当虚拟机在执行本地方法时,会尝试在已经加载的本地代码库中查找本地方法的对应实现。在查找到对应的实现方法之后,虚拟机会负责进行参数传递、实际方法调用和返回值传递等工作。


public class HelloNative {
    static{
        System.loadLibrary("greetLib");
    }

    public static native  void greeting();
}

下一步要编写实现本地方法的C/C++代码。Java提供的命令行工具根据Java源代码生成C/C++代码所需的头文件。对于本地方法,头文件中会包含相关的方法声明与其对应。


F:\source\JNI\class="lazy" data-src>javac -h .\ .\HelloNative.java

通过下边自动生成的头文件,我们可以看到这里有很多的隐式约定,我们只要按照这个声明进行实现即可,具体的规则不是今天的重点,不进行详述。



#include <jni.h>


#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

三、elasticsearch使用JNA实现本地调用

通过上边对JNI的简单了解,我们更多的时候碰到的情况是,在编写Java程序之前,就已经有了可以使用的本地代码库。这个本地代码库可能是程序的一部分,也可能是底层操作系统自带的。这些本地代码库的特点是在实现的时候并没有考虑与Java虚拟机的集成,因此也没有使用与JNI相关的内容。在使用这样的本地代码库时,我们就需要一个中间的本地代码库作为桥梁。这个本地代码库作为Java程序中本地方法的实现,负责实际调用时的参数类型转换和返回值传递等工作。这个过程是十分的繁琐的,Java提供了JNA来支持这种情况。

我们知道elasticsearch启动的时候需要检测当前用户是否是root用户,这个检测是直接调用的底层操作系统的代码,我们来看下elasticsearch是怎样使用JNA实现的。

首先elasticsearch提供了Natives类,作为调用本地方法的入口,并负责检测JNA的可用性。


 static {
        boolean v = false;
        try {
            // load one of the main JNA classes to see if the classes are available. this does not ensure that all native
            // libraries are available, only the ones necessary by JNA to function
            Class.forName("com.sun.jna.Native");
            v = true;
        } catch (ClassNotFoundException e) {
            logger.warn("JNA not found. native methods will be disabled.", e);
        } catch (UnsatisfiedLinkError e) {
            logger.warn("unable to load JNA native support library, native methods will be disabled.", e);
        }
        JNA_AVAILABLE = v;
    }

检测JNA是否可用,然后再调用JNANatives的对用方法


static boolean definitelyRunningAsRoot() {
        if (!JNA_AVAILABLE) {
            logger.warn("cannot check if running as root because JNA is not available");
            return false;
        }
        return JNANatives.definitelyRunningAsRoot();
    }

在JNANatives的definitelyRunningAsRoot中,如果是非windows系统,则调用
JNACLibrary.geteuid



    static boolean definitelyRunningAsRoot() {
        if (Constants.WINDOWS) {
            return false; // don't know
        }
        try {
            return JNACLibrary.geteuid() == 0;
        } catch (UnsatisfiedLinkError e) {
            // this will have already been logged by Kernel32Library, no need to repeat it
            return false;
        }
    }

elasticsearch使用JNAKernel32Library来封装对windows的Kernel32的调用,使用 JNACLibrary来封装对非windows系统的libc的调用


 static {
        try {
            Native.register("c");
        } catch (UnsatisfiedLinkError e) {
            logger.warn("unable to link C library. native methods (mlockall) will be disabled.", e);
        }
    }

    static native int mlockall(int flags);

    static native int geteuid();

四、总结

JNI更适合使用本地调用来解决对性能有更高要求的场景,需要我们自己使用C或者C++来实现处理逻辑。对于调用已有的本地库的方法或者操作系统的方法,使用JNA更为方便便捷。

到此这篇关于Java调用elasticsearch本地代码的文章就介绍到这了,更多相关Java调用elasticsearch内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java调用elasticsearch本地代码的操作方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java如何调用elasticsearch本地代码

本篇内容主要讲解“Java如何调用elasticsearch本地代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何调用elasticsearch本地代码”吧!一、为什么要进行本地调用
2023-06-14

Java操作Elasticsearch rest-high-level-client 的基本使用

这篇文章主要介绍了Java操作Elasticsearch rest-high-level-client 的基本使用,本篇主要讲解一下 rest-high-level-client 去操作 Elasticsearch的方法,结合实例代码给大家详细讲解,需要的朋友可以参考下
2022-11-13

Springboot使用RestTemplate调用第三方接口的操作代码

这篇文章主要介绍了Springboot使用RestTemplate调用第三方接口,我只演示了最常使用的请求方式get、post的简单使用方法,当然RestTemplate的功能还有很多,感兴趣的朋友可以参考RestTemplate源码
2022-12-08

C#调用Excel的操作方法

本篇内容主要讲解“C#调用Excel的操作方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#调用Excel的操作方法”吧!C# 操作Excel之Excel操作方法调用1.插入图片和线调用Pi
2023-06-17

Java执行hadoop的基本操作实例代码

Java执行hadoop的基本操作实例代码向HDFS上传本地文件public static void uploadInputFile(String localFile) throws IOException{ Configuratio
2023-05-31

Java WorkBook对Excel的基本操作方法

这篇文章主要介绍了Java WorkBook对Excel的基本操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-14

CentOS8 安装MongoDB 本地连接的操作方法

MongoDB是一个由C++语言编写的基于分布式文件存储的数据库,MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,这篇文章主要介绍了CentOS8 安装MongoDB 本地连接,需要的朋友可以参考下
2022-11-13

Python工具脚本调用外层模块的操作方法

本文详细讲解了Python工具脚本调用外层模块的操作方法。通过导入语句,可以导入math等外部模块,并使用模块中的函数、类和变量。导入外部模块的方法包括直接导入和指定别名导入。另外,文章还介绍了导入本地模块、避免循环导入、处理导入错误和动态导入模块等高级技巧。最后以计算圆面积的示例演示了如何使用math模块。
Python工具脚本调用外层模块的操作方法
2024-04-02

java反射之方法反射的基本操作方法

本文接上文“java反射之获取类的信息方法(推荐)”,利用反射(invoke)来获取一个类中的方法来执行。1、定义一个类,包含三个名称相同,参数不同的方法class A{ public void print(){ System.ou
2023-05-31

在服务器和本地环境中调试 PHP 代码的有效方法?

在服务器环境中调试 php 代码可以使用错误日志、xdebug、cloud ide 或 ssh 调试,但在本地环境下可以使用 xdebug、php 内置函数、ide 调试器或 behat/mink 测试框架。实战案例演示了使用 xdebug
在服务器和本地环境中调试 PHP 代码的有效方法?
2024-04-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录