文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java如何调用elasticsearch本地代码

2023-06-14 11:09

关注

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

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

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\src>javac -h .\ .\HelloNative.java

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

#include <jni.h>#ifndef _Included_HelloNative#define _Included_HelloNative#ifdef __cplusplusextern "C" {#endifJNIEXPORT 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();

到此,相信大家对“Java如何调用elasticsearch本地代码”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯