接上一篇《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的多版本处理方式是一致的。