接上一篇《Elasticsearch 2.X 版本Java插件开发简述》
开发1.X版本elasticsearch java插件与2.X版本有一些不同,同时在安装部署上也有些不同,主要区别如下:
1:插件入口plugin区别与2.X版本,改为继承org.elasticsearch.plugins.AbstractPlugin,而Plugin作为一个接口被AbstractPlugin实现,具体代码如下:
1 package com.gridsum.es.rest.plugin; 2 3 import org.elasticsearch.plugins.AbstractPlugin; 4 import org.elasticsearch.rest.RestModule; 5 6 public class MyRestPlugin extends AbstractPlugin { 7 8 public String description() { 9 // TODO Auto-generated method stub 10 return "rest plugin 4 elasticsearch-1.x"; 11 } 12 13 public String name() { 14 // TODO Auto-generated method stub 15 return "rest plugin 1.x"; 16 } 17 18 public void onModule(RestModule module){ 19 module.addRestAction(MyRestHandler.class); 20 } 21 }
2:elasticsearch配置文件的读取从plugin子类中读取改为在handler中读取,具体代码如下:
1 package com.gridsum.es.rest.plugin; 2 3 import org.elasticsearch.rest.*; 4 import org.elasticsearch.client.Client; 5 import org.elasticsearch.common.inject.Inject; 6 import org.elasticsearch.common.settings.Settings; 7 import com.gridsum.es.rest.plugin.MyRestFilter; 8 9 //import java.util.Map; 10 //import java.util.TreeMap; 11 12 public class MyRestHandler extends BaseRestHandler { 13 14 @Inject 15 protected MyRestHandler(Settings settings, RestController controller, 16 Client client) { 17 super(settings, controller, client); 18 GetPluginSettings(settings); 19 RestFilter filter = new MyRestFilter(client); 20 controller.registerFilter(filter); 21 } 22 23 @Override 24 protected void handleRequest(RestRequest request, RestChannel channel, 25 Client client) throws Exception { 26 // TODO Auto-generated method stub 27 28 } 29 30 private void GetPluginSettings(Settings settings){ 31 if(null == settings){ 32 MyLogger.info("Get settings failed: the settings is null."); 33 return; 34 } 35 36 // MyLogger.info("Begin to get plugin settings..."); 37 // Map<String,String> s = settings.getAsMap(); 38 // for(Map.Entry<String, String> m : s.entrySet()){ 39 // MyLogger.info("key="+m.getKey()+",value="+m.getValue()); 40 // } 41 42 String isPluginEnabled = settings.get("ld.enabled"); 43 MethodAuthenticator.setEnabledStr(isPluginEnabled); 44 if(isPluginEnabled != null && isPluginEnabled.toLowerCase().equals("true")){ 45 MethodAuthenticator.setIsPluginEnabled(true); 46 String[] denyMethods = settings.getAsArray("ld.deny", new String[]{}); 47 if(denyMethods != null && denyMethods.length > 0){ 48 MethodAuthenticator.setDenyMethods(denyMethods); 49 } else { 50 MyLogger.warn("The deny method(s) is empty."); 51 } 52 } else { 53 MethodAuthenticator.setIsPluginEnabled(false); 54 } 55 } 56 }
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的多版本处理方式是一致的。