[JAVA] Apache Geode-Einfache Möglichkeit, Logik auf der Serverseite auszuführen

Einführung

In Apache Geode, einer der KVS-Implementierungen des verteilten Systemtyps, wird häufig eine Funktion namens Function Execution verwendet, wenn Sie eine Logik auf der Serverseite ausführen möchten. Da die Ausführung von Functoin jedoch sehr funktional ist, ist der Umfang der Codierung außer dem Festlegen von Elementen und der tatsächlichen Logik in der Regel groß, und bestimmte Logik wird unabhängig von der Datenanordnung im Cluster nur einmal auf einem der Cache-Serverknoten ausgeführt und zurückgegeben. In einfachen Fällen, in denen kein Wert erforderlich ist, kann die Verwendung etwas entmutigend sein.

In diesem Artikel werde ich Ihnen zeigen, wie Sie mit Apache Geode die Logik auf der Serverseite einfacher ausführen können, ohne die Funktion zur Funktionsausführung zu verwenden. Im Folgenden wird die Entität, die eine beliebige Logik ausführt, als "Befehl" bezeichnet. Es wurde bestätigt, dass die Methode in diesem Artikel mit Apache Geode 1.6.0 funktioniert.

Zweck

In diesem Artikel werden als einfaches Beispiel für die serverseitige Logikausführung die folgenden Inhalte festgelegt und implementiert, ohne die Funktion Funktionsausführung zu verwenden.

Wie es funktioniert

Die Logik wird auf der Serverseite ausgeführt, ohne die Funktion Funktionsausführung durch den folgenden Mechanismus zu verwenden.

  1. Bereiten Sie eine dedizierte Region vor, um die Logik auszuführen (im Folgenden Befehlsregion). Eine Proxy-Region ist in Ordnung, da sie keine Daten speichert ( refid = REPLICATED_PROXY).
  2. In der Befehlsregion wird das Befehlsobjekt als Wert festgelegt. Die put - Taste wird nicht verwendet, also ein beliebiger Wert.
  3. Führen Sie den als Wert übergebenen Befehl mit CacheWriter aus, der zuvor der Befehlsregion auf der Serverseite zugewiesen wurde.

Der Grund für die Verwendung von "CacheWriter" anstelle des häufig verwendeten "CacheListner" ist, dass erstere grundsätzlich alle zugewiesenen Cache-Server reagieren lassen und der Befehl zweimal ausgeführt werden kann. Dies liegt daran, dass letzterer auf einem der gewährten Cache-Server ausgeführt wird, während er sexuell ist.

Als Referenz ist das Ausführungsbilddiagramm unten angegeben. 20180926-executionImage.png

Befehl erstellen

Als Richtlinie wird unter der Annahme, dass eine Klasse für jeden Befehl einzeln vorbereitet wird, die folgende Befehlsschnittstelle definiert, um die Logik für die Ausführung von Befehlen mit "CacheWriter" zu standardisieren.

Command.java


public interface Command {
  public void process();
}

Schreiben Sie als Nächstes in Form der Implementierung die Befehlsklasse zum Löschen von Daten der angegebenen Region wie folgt. Führen Sie Region # clear mit der in der Befehlsschnittstelle definierten Methode process aus, die auf der Region ( regionName) basiert, die beim Instanziieren dieser Befehlsklasse angegeben wurde.

ClearRegionCommand.java


import org.apache.geode.cache.CacheFactory;
import org.apache.geode.cache.Region;

import java.io.Serializable;

public class ClearRegionCommand implements Command, Serializable {
  private String regionName;
  
  public ClearRegionCommand(String regionName) {
    this.regionName = regionName;
  }
  
  public void process() {
    Region region = CacheFactory.getAnyInstance().getRegion(this.regionName);
    if (region != null) {
      region.clear();
    }
  }
}

Beachten Sie, dass das Befehlsobjekt selbst über das Netzwerk an den Server gesendet wird und daher als serialisierbares Objekt implementiert werden muss. Hier haben wir bereits java.io.Serializable implementiert, aber da es sich um Apache Geode handelt, können Sie PDX als Objekt-Serialisierungstechnologie verwenden.

Und die Implementierung von CacheWriter, die den Befehl ausführt. Holen Sie sich in der beforeCreate -Methode das Befehlsobjekt aus dem von put generierten Ereignis und führen Sie die process -Methode aus. Übrigens wird "CacheWriter" häufig in der Cache-Einstellungsdatei (im Folgenden "cache.xml") definiert und "Declarable" für alle Fälle implementiert.

ProcessCommandCacheWriter.java


import org.apache.geode.cache.Cache;
import org.apache.geode.cache.CacheWriterException;
import org.apache.geode.cache.Declarable;
import org.apache.geode.cache.EntryEvent;
import org.apache.geode.cache.util.CacheWriterAdapter;

import java.util.Properties;

public class ProcessCommandCacheWriter extends CacheWriterAdapter<Integer,Command> implements Declarable {
  public void beforeCreate(EntryEvent<Integer,Command> event) throws CacheWriterException {
    Command command = event.getNewValue();
    command.process();
  }

  public void initialize(Cache cache, Properties properties) { }

  public void close() {}
}

CacheWriter Einstellungen

Hier wird es mit cache.xml eingestellt. Es wird an die Befehlsregion übergeben, in der "REPLICATE_PROXY" in "refid" gesetzt ist. Die Beispielregion ist die Beispielregion, die von dem diesmal implementierten Befehl "Regoin # clear" ausgeführt werden soll.

cache.xml


<?xml version="1.0" encoding="UTF-8"?>
<cache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://geode.apache.org/schema/cache"
       xsi:schemaLocation="http://geode.apache.org/schema/cache http://geode.apache.org/schema/cache/cache-1.0.xsd"
       version="1.0" lock-lease="120" lock-timeout="60" search-timeout="300" is-server="false" copy-on-read="false">

    <cache-server port="0" />

    <region name="Example" refid="REPLICATE" />

    <region name="Command" refid="REPLICATE_PROXY">
        <region-attributes>
            <cache-writer>
                <class-name>ProcessCommandCacheWriter</class-name>
            </cache-writer>
        </region-attributes>
    </region>
</cache>

CLASSPATH-Einstellung

Vom Client eingegebene Befehle werden auf dem Server ausgeführt, daher müssen Sie den Pfad zu verschiedenen verwandten Klassen im CLASSPATH des Servers festlegen. Der Befehlsklassenkörper (hier ClearRegionCommand) kann bei Bedarf dynamisch mit dem Befehl gfsh deploy festgelegt werden, aber beim Starten des Servers muss mindestens der Pfad zu den folgenden Klassen festgelegt werden. Es gibt.

-- CacheWriter Klasse (hier ProcessCommandCacheWriter Klasse)

Die Schnittstelle scheint nicht in der Lage zu sein, CLASSPATH mit dem Befehl gfsh deploy festzulegen

Befehlseingabe vom Client

Erstellen Sie ein Befehlsobjekt und codieren Sie es im Befehlsbereich wie folgt als Wert put:

ClientCache cache = new ClientCacheFactory()
  .set("cache-xml-file", "client-cache.xml")
  .create();
cache.getRegion("Command").put(0, new ClearRegionCommand("Example"));

Als Referenz ist das Folgende eine Beispiel-cache.xml auf der Clientseite.

client-cache.xml


<?xml version="1.0" encoding="UTF-8"?>
<client-cache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://geode.apache.org/schema/cache"
       xsi:schemaLocation="http://geode.apache.org/schema/cache http://geode.apache.org/schema/cache/cache-1.0.xsd"
       version="1.0" copy-on-read="false">

    <pool name="MyPool" subscription-enabled="true">
        <locator host="xxx.xxx.xxx.xxx" port="xxxxx" />
    </pool>

    <region name="Example">
        <region-attributes pool-name="MyPool" refid="CACHING_PROXY" />
    </region>

    <region name="Command">
        <region-attributes pool-name="MyPool" refid="PROXY" />
    </region>
</client-cache>

Schließlich

Wenn ich es als Artikel zusammenfasse, habe ich das Gefühl, dass es mehr Codes und Einstellungen gibt, als ich im Fall von Function Executoin erwartet hatte, aber ich denke, dass es für Benutzer einfach ist, Befehle vom Client in einer Zeile einzugeben. Ich bin.

Darüber hinaus ist es mit der diesmal eingeführten Methode durch Hinzufügen der Gateway-Sender-Einstellung zum Befehlsbereich möglich, eine beliebige Logik auch in einem anderen Cluster auszuführen, wobei der Gateway-Empfänger über das WAN eingestellt ist. Wenn Sie interessiert und gefragt sind, probieren Sie es aus.

Recommended Posts

Apache Geode-Einfache Möglichkeit, Logik auf der Serverseite auszuführen
[Java] So rufen Sie die von HTML auf der Serverseite übergebenen Parameter ab
Migration von Eclipse zu IntelliJ (unterwegs)
SSH-Login beim App-Server mit Heroku
Der Schlüssel zum Ausführen von Docker auf Raspberry Pi 4 (Ubuntu Server 20.04)
Beispiel zum Erstellen eines Einmalkennworts auf Server- und Clientseite
So deaktivieren Sie Set-Cookie über die API auf der Vorderseite
So führen Sie React und Rails auf demselben Server aus
So zeigen Sie 0 auf der linken Seite des Standardeingabewerts an
Logik zum Zeichnen eines Kreises auf der Konsole mit ASCII-Grafik
Programmieren mit Ruby (unterwegs)
Überprüfen Sie das von Firebase auf der Serverseite erhaltene ID-Token (Java + SpringBoot).
Rufen Sie das Ereignis ab, bei dem die iOS-App auf der Ansichtsseite nach hinten verschoben wird
Verwendung von Apache Derby unter Eclipse
Kick ShellScript auf dem Server von Java
Führen Sie den in der Zwischenablage gespeicherten Java-Code aus.
Vorverarbeitung zur Anzeige im Browser (Compiler)
Freigeben auf der Hostseite (Windows) und der Gastseite (CentOS 7) mit VirtualBox