基於elasticsearch6.2.3版本自定義插件開發遇到的問題總結

項目背景:

    原本工業APP的知識文章之類的存儲在MySQL中,但是在後期的開發中發現在查詢的時候又不滿足業務的模糊查詢需求並且需要兼容前期的設計(ID爲數值型的要求)。

項目構建:

    項目利用gradle構建,利用shadowJar插件來打包需要的程序代碼,默認打包的包含程序代碼和依賴,但是開發插件是不能將es打包會造成包衝突。代碼如圖:


開發過程:

   1、繼承Plugin類和實現ActionPlugin接口並將插件名稱註冊即可;


2、自定義類繼承BaseRestHandler,在構造方法中註冊自定義的uri,並且prepareRequest方法中完成自定義的實現方式,ID自增的方式是本機IP地址奇數乘積後相加然後加上當前的毫秒時間戳不大於19爲long的最大值即可。

下面介紹一下plugin-descriptor.properties文件:

description:插件描述

name: 插件名稱

version : 版本號

classname : 自定義插件的全路徑名

java.version : Java版本號

elasticsearch.version : elasticsearch 版本號



以下是打包運行時出現的問題:

一:elasticsearch插件目錄問題:

在開發elasticsearch6.2.3插件時編寫好插件後,把插件上傳到plugins目錄下

加載時

./elasticsearch-plugin install file:///opt/elasticsearch-6.2.3/plugins/elasticsearch.zip 

會報錯如下:

ERROR: `elasticsearch` directory is missing in the plugin zip

可是的zip包中確實包含了elasticsearch文件目錄,這條路暫時走不通了(也許是我沒有理解官網的意思,英文是硬傷啊)。

另一個思路開始:

既然官網的說jar包和配置文件都必須包含在elasticsearch目錄,那麼就直接在plugins目錄下建立elasticsearch目錄,然後把jar包和配置文件上傳到此目錄,然後啓動elasticsearch,結果成功了,目錄結果如下



另一種解決方案:

可以在moudles目錄下建立目錄如:xx目錄,將jar包和配置文件上傳至此目錄,如下圖:


elasticsearch啓動後會自動加載它。

二:Java安全框架問題總結:

在開發elasticsearch框架時會遇到java.security.AccessControlException異常,因爲es啓動不能用root賬戶啓動,如果項目中需要用到Redis或者zookeeper或者讀文件或者數據庫等,可能也會有一下問題。

解決方案:

在$JAVA_HOME/lib/security/java.policy加入相應權限即可:

permission java.io.FilePermission "file:/opt/elasticsearch-6.2.3/modules/key-plugin/conf/xxx.properties", "read";
permission javax.management.MBeanServerPermission "createMBeanServer";
permission javax.management.MBeanPermission "org.apache.commons.pool2.impl.GenericObjectPool#-[org.apache.commons.pool2:name=pool,type=GenericObjectPool]", "registerMBean";
permission javax.management.MBeanTrustPermission "register";
permission java.lang.RuntimePermission "getClassLoader";
permission java.net.SocketPermission "xxxx.xxxx.xx.xx:6379","connect,resolve";
permission java.net.SocketPermission "xxxx.xxxx.xx.xx:2181","connect,resolve";





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章