Die BPC Version 4.0 wird nicht mehr gewartet.

Sollten Sie diese BPC Version nutzen, empfehlen wir Ihnen eine Migration auf eine aktuelle Version. Die Dokumentation zur neusten BPC Version finden Sie hier. Sollten Sie Fragen haben, wenden Sie sich bitte an unseren Support.

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 eine managed_indices.json anlegen

  • dessen Inhalt dem vom BPC Core zur Verfügung gestellten ElasticsearchService bekannt geben

Verzeichnisstruktur

Diagram

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.

manages_indices.json
{
  "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 auf true 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

Einfaches Beispiel

für einen Index mit dem Namen 'example-queries'.

manages_indices.json
{
  "managedIndices": [
    {
      "name": "example-queries",
      "mappings": {
        "properties": {
          "queryName": {
            "type": "keyword"
          },
          "query": {
            "type": "keyword"
          },
          "chartConfig": {
            "type": "text",
            "index": false
          }
        }
      }
    }
  ]
}

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.

ExampleBaseModule.java
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);
        }
    }
}

Keywords: