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.
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.
Die Logik wird auf der Serverseite ausgeführt, ohne die Funktion Funktionsausführung durch den folgenden Mechanismus zu verwenden.
refid = REPLICATED_PROXY
). put
- Taste wird nicht verwendet, also ein beliebiger Wert. 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.
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
EinstellungenHier 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>
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
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>
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