Anlegen von Indices
Wenn in eigenen Bundles Elasticsearch Indices zur Persistierung von Daten (keine Einstellungen) verwendet werden sollen, dann empfiehlt es sich diese über den BPC Core anlegen zu lassen.
Dies bietet folgende Vorteile
-
es wird einiges an Boilerplate Code vermieden
-
einfache Festlegung der Index Settings und Mappings über eine JSON Datei
-
wenn der Index nicht vorhanden ist, dann wird er automatisch angelegt
-
die Indices werden mit einem Alias nach BPC Vorgaben erstellt
-
kann von der BPC Reindex Funktionalität aus aufgerufen werden
Vorgehen in Kürze
-
im
resources
Verzeichnis des eigenen Backend Bundles einemanaged_indices.json
anlegen -
dessen Inhalt dem vom BPC Core zur Verfügung gestellten
ElasticsearchService
bekannt geben
Aufbau der JSON Datei
Im resources
Verzeichnis des eigenen Backend Bundles eine managed_indices.json
anlegen.
Diese kann für mehrere anzulegenden Indices verwendet werden und muss folgenden Aufbau haben.
{
"managedIndices": [
{
"name": "irgend-ein-index-name-1",
"create_on_start": true|false,
"settings": { ... },
"mappings": { ... }
},
{
"name": "irgend-ein-index-name-2",
"create_on_start": true|false,
"settings": { ... },
"mappings": { ... }
},
...
}
-
name
- der Name des Index bzw. dies wird dann der Alias des Index. -
create_on_start
- Flag ob der Index gleich beim Start des Bundles (Registrierung) angelegt werden soll. Wenn nicht gesetzt, dann ist es wie wenn der Wert auftrue
gesetzt wurde. -
settings
- die Settings eines Elasticsearch Index. Diese nur setzen, wenn man weiß was man macht. Sind sie nicht gesetzt, dann werden beim anlegen die festgelegten Werte aus der Core-Einstellung verwendet. "Core_IndexCreationSettings" verwendet. -
mappings
- die Mappings eines Elasticsearch Index
Registrierung
Im folgenden ExampleBaseModule.java
Beispiel wird der ElasticsearchService
vom BPC Core geholt und in der Methode createIndices(ElasticsearchService es)
wird dann das managed_indices.json
geladen und über den ElasticsearchService
registriert. Bei der Gelegenheit auch mal die vom ElasticsearchService
zur Verfügung gestellten Methoden anschauen.
package com.company.example;
import de.virtimo.bpc.api.ModuleManager;
import de.virtimo.bpc.api.service.ElasticsearchService;
import de.virtimo.bpc.core.exception.ElasticsearchRelatedException;
import de.virtimo.bpc.module.AbstractInstantiableModule;
import de.virtimo.bpc.module.JsonDefaultsUtil;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
public abstract class ExampleBaseModule extends AbstractInstantiableModule {
private static final Logger LOG = Logger.getLogger(ExampleBaseModule.class.getName());
private ServiceTracker elasticsearchServiceTracker;
private ElasticsearchService elasticsearchService;
public ExampleBaseModule(ModuleManager moduleManager) {
super(moduleManager);
}
@Override
public void setModuleBundle(Bundle moduleBundle) {
super.setModuleBundle(moduleBundle);
if (elasticsearchServiceTracker == null) {
elasticsearchServiceTracker = new ElasticsearchServiceTracker(moduleBundle.getBundleContext());
elasticsearchServiceTracker.open();
}
}
@Override
public void destroy() {
super.destroy();
if (elasticsearchServiceTracker != null) {
elasticsearchServiceTracker.close();
elasticsearchServiceTracker = null;
}
}
public synchronized ElasticsearchService getElasticsearchService() {
LOG.info("getElasticsearchService");
if (elasticsearchService == null) {
throw new IllegalStateException("Elasticsearch service is not available at the moment.");
}
return elasticsearchService;
}
private synchronized void createIndices(ElasticsearchService es) throws ElasticsearchRelatedException {
LOG.info("createIndices elasticsearchService=" + es);
Bundle bundle = FrameworkUtil.getBundle(this.getClass());
Map<String, Object> managedIndicesConfigMap = JsonDefaultsUtil.loadJsonFileAsMap(bundle, "managed_indices.json");
es.prepareManagedIndices(managedIndicesConfigMap);
}
private class ElasticsearchServiceTracker extends ServiceTracker {
public ElasticsearchServiceTracker(BundleContext context) {
super(context, ElasticsearchService.class.getName(), null);
}
@Override
public Object addingService(ServiceReference reference) {
elasticsearchService = (ElasticsearchService) context.getService(reference);
try {
createIndices(elasticsearchService);
} catch (ElasticsearchRelatedException ex) {
LOG.log(Level.SEVERE, "Failed to create the managed indices.", ex);
}
return elasticsearchService;
}
@Override
public void removedService(ServiceReference reference, Object service) {
elasticsearchService = null;
context.ungetService(reference);
}
}
}