Elasticsearch 1.X 版本Java插件开发

时间:2023-03-09 04:55:46
Elasticsearch 1.X 版本Java插件开发

接上一篇《Elasticsearch 2.X 版本Java插件开发简述

开发1.X版本elasticsearch java插件与2.X版本有一些不同,同时在安装部署上也有些不同,主要区别如下:

1:插件入口plugin区别与2.X版本,改为继承org.elasticsearch.plugins.AbstractPlugin,而Plugin作为一个接口被AbstractPlugin实现,具体代码如下:

 package com.gridsum.es.rest.plugin;

 import org.elasticsearch.plugins.AbstractPlugin;
 import org.elasticsearch.rest.RestModule;

 public class MyRestPlugin extends AbstractPlugin {

     public String description() {
         // TODO Auto-generated method stub
         return "rest plugin 4 elasticsearch-1.x";
     }

     public String name() {
         // TODO Auto-generated method stub
         return "rest plugin 1.x";
     }

     public void onModule(RestModule module){
         module.addRestAction(MyRestHandler.class);
     }
 }

2:elasticsearch配置文件的读取从plugin子类中读取改为在handler中读取,具体代码如下:

 package com.gridsum.es.rest.plugin;

 import org.elasticsearch.rest.*;
 import org.elasticsearch.client.Client;
 import org.elasticsearch.common.inject.Inject;
 import org.elasticsearch.common.settings.Settings;
 import com.gridsum.es.rest.plugin.MyRestFilter;

 //import java.util.Map;
 //import java.util.TreeMap;

 public class MyRestHandler extends BaseRestHandler {

     @Inject
     protected MyRestHandler(Settings settings, RestController controller,
             Client client) {
         super(settings, controller, client);
         GetPluginSettings(settings);
         RestFilter filter = new MyRestFilter(client);
         controller.registerFilter(filter);
     }

     @Override
     protected void handleRequest(RestRequest request, RestChannel channel,
             Client client) throws Exception {
         // TODO Auto-generated method stub

     }    

     private void GetPluginSettings(Settings settings){
         if(null == settings){
             MyLogger.info("Get settings failed: the settings is null.");
             return;
         }

 //        MyLogger.info("Begin to get plugin settings...");
 //        Map<String,String> s = settings.getAsMap();
 //        for(Map.Entry<String, String> m : s.entrySet()){
 //            MyLogger.info("key="+m.getKey()+",value="+m.getValue());
 //        }

         String isPluginEnabled = settings.get("ld.enabled");
         MethodAuthenticator.setEnabledStr(isPluginEnabled);
         if(isPluginEnabled != null && isPluginEnabled.toLowerCase().equals("true")){
             MethodAuthenticator.setIsPluginEnabled(true);
             String[] denyMethods = settings.getAsArray("ld.deny", new String[]{});
             if(denyMethods != null && denyMethods.length > 0){
                 MethodAuthenticator.setDenyMethods(denyMethods);
             } else {
                 MyLogger.warn("The deny method(s) is empty.");
             }
         } else {
             MethodAuthenticator.setIsPluginEnabled(false);
         }
     }
 }

3:Filter的实现跟2.X版本是一致的,均继承自org.elasticsearch.rest.RestFilter抽象类;

4:配置文件与2.X不同,在src/main/resources下不是使用的plugin-descriptor.properties配置文件,而是一个简单的es-plugin.properties文件,该文件只是简单地指明了AbstractPlugin实现类的命名,如下所示:

plugin=com.gridsum.es.rest.plugin.MyRestPlugin

注意这个值包含package+类名,用于反射该类。


5:同样使用maven打包后,zip文件内包含一个jar文件及第4步定义的properties文件即可;

6:部署插件的方式与2.X版本有所不同,具体部署指令如下所示:

/usr/share/elasticsearch/bin/plugin --url file:///opt/myrest.zip --install rest.plugin1x

与2.X版本部署不同的是,1.X版本中,插件ZIP包的路径由--url获取,而--install后参数为该插件的命名(pom.xml中的project.name值或build.finalName值)。

7:部署后仍然以同样的方法在默认路径/etc/elasticsearch/elasticsearch.yml的配置文件中加入配置信息,重新启动elasticsearch即可。

8:关于1.X版本的多版本支持,比2.X方便的是1.X版本插件可以直接支持多版本,在我测试的1.5.0/1.5.2/1.7.3三个版本中,都是同一个插件包,均可正常使用,由此可见,至少在Request处理这个环节上,1.X的多版本处理方式是一致的。