欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java調(diào)用elasticsearch本地代碼的操作方法

 更新時間:2021年04月09日 11:32:00   作者:無風(fēng)聽海  
這篇文章主要介紹了Java調(diào)用elasticsearch本地代碼的操作方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

雖然Java虛擬機為開發(fā)人員屏蔽了底層的實現(xiàn)細節(jié),使得開發(fā)人員不用考慮底層操作系統(tǒng)的差異性。不過在某些應(yīng)用程序中,還是免不了要直接與底層操作系統(tǒng)上的原生代碼進行交互。今天我們就來看一下Java對本地調(diào)用提供的支持。

一、為什么要進行本地調(diào)用

1.基于性能的考慮

Java語言從其運行速度上來說,在大多數(shù)方面是慢于底層操作系統(tǒng)上原生的C和C++等語言的。這主要是由于Java虛擬機這個中間層次的存在。如果完全用Java語言實現(xiàn)的性能無法達到程序的預(yù)期要求,可以選擇把部分重要且耗時的代碼用C或C++來實現(xiàn)。

2.基于某些特殊的需求

Java平臺提供的標(biāo)準(zhǔn)類庫的功能很強大,包括了在開發(fā)中可能遇到的大部分功能。但是仍然有一些功能無法用標(biāo)準(zhǔn)API來實現(xiàn),主要是一些與底層硬件平臺直接交互的功能。Java虛擬機沒有把這一部分功能暴露給運行在其上的程序。如果需要這方面的功能,那么只能使用原生代碼來進行開發(fā)。

3.與已有的使用原生代碼編寫的程序之間進行集成。

如果Java程序需要與底層操作系統(tǒng)上由C和C++語言開發(fā)的程序進行交互,那么可以進行本地調(diào)用。

我們平時的開發(fā)更多的情況是后邊兩種情況;在elasticsearch中基本上是屬于第二種情況。

二、使用JNI實現(xiàn)本地調(diào)用

針對以上提到的各種情況,Java提供了JNI(Java Native Interface)和JNA(Java Native Access)兩種方式,其中JNI的一個重要使用場景是提高程序的性能。當(dāng)對程序中關(guān)鍵部分的性能要求比較高的時候,可以使用C和C++代碼來實現(xiàn)。

我們先來看下怎么使用JNI來進行本地調(diào)用。

首先我們需要有一個Java類來聲明本地方法,并負(fù)責(zé)加載本地代碼庫。本地方法與Java接口中的方法或抽象類中的抽象方法一樣,只包含方法聲明,沒有相關(guān)的實現(xiàn)。程序中的其他部分可以用正常的方法調(diào)用本地方法,比如參數(shù)傳遞和返回值使用等都與正常的方法相同。當(dāng)虛擬機在執(zhí)行本地方法時,會嘗試在已經(jīng)加載的本地代碼庫中查找本地方法的對應(yīng)實現(xiàn)。在查找到對應(yīng)的實現(xiàn)方法之后,虛擬機會負(fù)責(zé)進行參數(shù)傳遞、實際方法調(diào)用和返回值傳遞等工作。

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

    public static native  void greeting();
}

下一步要編寫實現(xiàn)本地方法的C/C++代碼。Java提供的命令行工具根據(jù)Java源代碼生成C/C++代碼所需的頭文件。對于本地方法,頭文件中會包含相關(guān)的方法聲明與其對應(yīng)。

F:\source\JNI\src>javac -h .\ .\HelloNative.java

通過下邊自動生成的頭文件,我們可以看到這里有很多的隱式約定,我們只要按照這個聲明進行實現(xiàn)即可,具體的規(guī)則不是今天的重點,不進行詳述。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */

#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloNative
 * Method:    greeting
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

三、elasticsearch使用JNA實現(xiàn)本地調(diào)用

通過上邊對JNI的簡單了解,我們更多的時候碰到的情況是,在編寫Java程序之前,就已經(jīng)有了可以使用的本地代碼庫。這個本地代碼庫可能是程序的一部分,也可能是底層操作系統(tǒng)自帶的。這些本地代碼庫的特點是在實現(xiàn)的時候并沒有考慮與Java虛擬機的集成,因此也沒有使用與JNI相關(guān)的內(nèi)容。在使用這樣的本地代碼庫時,我們就需要一個中間的本地代碼庫作為橋梁。這個本地代碼庫作為Java程序中本地方法的實現(xiàn),負(fù)責(zé)實際調(diào)用時的參數(shù)類型轉(zhuǎn)換和返回值傳遞等工作。這個過程是十分的繁瑣的,Java提供了JNA來支持這種情況。

我們知道elasticsearch啟動的時候需要檢測當(dāng)前用戶是否是root用戶,這個檢測是直接調(diào)用的底層操作系統(tǒng)的代碼,我們來看下elasticsearch是怎樣使用JNA實現(xiàn)的。

首先elasticsearch提供了Natives類,作為調(diào)用本地方法的入口,并負(fù)責(zé)檢測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是否可用,然后再調(diào)用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系統(tǒng),則調(diào)用
JNACLibrary.geteuid

/** Returns true if user is root, false if not, or if we don't know */
    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的調(diào)用,使用 JNACLibrary來封裝對非windows系統(tǒng)的libc的調(diào)用

 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();

四、總結(jié)

JNI更適合使用本地調(diào)用來解決對性能有更高要求的場景,需要我們自己使用C或者C++來實現(xiàn)處理邏輯。對于調(diào)用已有的本地庫的方法或者操作系統(tǒng)的方法,使用JNA更為方便便捷。

到此這篇關(guān)于Java調(diào)用elasticsearch本地代碼的文章就介紹到這了,更多相關(guān)Java調(diào)用elasticsearch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CorsFilter 過濾器解決跨域的處理

    CorsFilter 過濾器解決跨域的處理

    這篇文章主要介紹了CorsFilter 過濾器解決跨域的處理操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程

    在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程

    這篇文章主要介紹了在SpringBoot: SpringBoot里面創(chuàng)建導(dǎo)出Excel的接口教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 解決Maven項目中 Invalid bound statement 無效的綁定問題

    解決Maven項目中 Invalid bound statement 無效的綁定問題

    這篇文章主要介紹了解決Maven項目中 Invalid bound statement 無效的綁定問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringCloud應(yīng)用idea實現(xiàn)可相互調(diào)用的多模塊程序詳解

    SpringCloud應(yīng)用idea實現(xiàn)可相互調(diào)用的多模塊程序詳解

    IDEA 全稱 IntelliJ IDEA,是java編程語言的集成開發(fā)環(huán)境。IntelliJ在業(yè)界被公認(rèn)為最好的Java開發(fā)工具,尤其在智能代碼助手、代碼自動提示、重構(gòu)、JavaEE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創(chuàng)新的GUI設(shè)計等方面的功能可以說是超常的
    2022-07-07
  • 一文掌握J(rèn)VM?Safe?Point

    一文掌握J(rèn)VM?Safe?Point

    關(guān)于?Safe?Point?是?JVM?中很關(guān)鍵的一個概念,但我估計有不少同學(xué)不是很懂,于是今天跟大家來深入聊聊?Safe?Point,通過本文學(xué)習(xí)你會了解什么是?Safe?Point?為啥需要?Safe?Point?Safe?Point?與?Stop?the?World?的關(guān)系?感興趣的朋友一起看看吧
    2022-10-10
  • 深入解析Java中的編碼轉(zhuǎn)換以及編碼和解碼操作

    深入解析Java中的編碼轉(zhuǎn)換以及編碼和解碼操作

    這篇文章主要介紹了Java中的編碼轉(zhuǎn)換以及編碼和解碼操作,文中詳細解讀了編碼解碼的相關(guān)IO操作以及內(nèi)存使用方面的知識,需要的朋友可以參考下
    2016-02-02
  • Java中如何獲取圖片文件格式(后綴)

    Java中如何獲取圖片文件格式(后綴)

    這篇文章主要介紹了Java中如何獲取圖片文件格式(后綴),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SparkSQL開窗函數(shù)分析使用示例

    SparkSQL開窗函數(shù)分析使用示例

    開窗函數(shù)的引入是為了既顯示聚集前的數(shù)據(jù),又顯示聚集后的數(shù)據(jù)。即在每一行的最后一列添加聚合函數(shù)的結(jié)果。開窗用于為行定義一個窗口,它對一組值進行操作,不需要使用 GROUP BY 子句對數(shù)據(jù)進行分組,能夠在同一行中同時返回基礎(chǔ)行的列和聚合列
    2023-01-01
  • spring boot中使用@Async實現(xiàn)異步調(diào)用任務(wù)

    spring boot中使用@Async實現(xiàn)異步調(diào)用任務(wù)

    本篇文章主要介紹了spring boot中使用@Async實現(xiàn)異步調(diào)用任務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • mybatis防止SQL注入的方法實例詳解

    mybatis防止SQL注入的方法實例詳解

    SQL注入是一種很簡單的攻擊手段,但直到今天仍然十分常見。那么mybatis是如何防止SQL注入的呢?下面腳本之家小編給大家?guī)砹藢嵗a,需要的朋友參考下吧
    2018-04-04

最新評論