Beim letzten Mal habe ich SpringDataGeode verwendet, um eine SpringBoot-Anwendung zu erstellen, die ein speicherinternes Datenraster verwendet, und es so implementiert, dass die Ereignisverarbeitung durchgeführt werden kann, wenn die Daten mit dem Server synchronisiert werden.
Erstellen einer Anwendung mit SpringDataGeode
Implementierung der Ereignisverarbeitung mit SpringDataGeode
Dieses Mal verwenden wir die Funktion von Spring Data Geode, um die im In-Memory-Cache registrierten Daten auf der lokalen Festplatte zu speichern. Wenn der im Cache integrierte Anwendungsserver gestartet wird, laden wir die Persistenzdatei und registrieren die Daten im Cache. ..
Nach der Untersuchung scheint es, dass es nur durch Hinzufügen einer Anmerkung realisiert werden kann.
ServerGeodeApplication.java
package spring.geode.server.geodeServer;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.Region;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.gemfire.ReplicatedRegionFactoryBean;
import org.springframework.data.gemfire.config.annotation.EnableDiskStore;
import org.springframework.data.gemfire.config.annotation.EnableDiskStore.DiskDirectory;
import org.springframework.data.gemfire.config.annotation.EnableLocator;
import org.springframework.data.gemfire.config.annotation.EnableManager;
import org.springframework.data.gemfire.config.annotation.PeerCacheApplication;
import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;
import spring.geode.geodeCommon.model.User;
import spring.geode.geodeCommon.region.UserRegion;
import spring.geode.server.geodeServer.repository.UserRepository;
@SpringBootApplication
@PeerCacheApplication(name = "SpringGeodeServerApplication", locators = "localhost[40404]")
@EnableGemfireRepositories(basePackageClasses = UserRepository.class)
//Diesmal wurde eine Annotation zur Datenpersistenz hinzugefügt
@EnableDiskStore(
name="SimpleDiskStore",
autoCompact=true,
diskDirectories = @DiskDirectory(location="/hoge/fuga/SpringGeodeData")
)
public class GeodeServerApplication {
public static void main(String[] args) {
SpringApplication.run(GeodeServerApplication.class, args);
}
@Configuration
@EnableLocator(port = 40404)
@EnableManager(start = true)
static class LocatorManagerConfiguration {
}
@Configuration
static class CacheInitializer {
@Bean
Region<Integer, User> userRegion(final GemFireCache cache) {
return new UserRegion().createUserRegion(cache);
}
@Bean
public ReplicatedRegionFactoryBean<Integer, User> replicatedRegion(GemFireCache cache) {
return new UserRegion().createUserRegionFactory(cache);
}
}
}
Durch Aktivieren von "@ EnableDiskStore" wird die Persistenzdatei an dem durch "diskDirectories" angegebenen absoluten Pfad ausgegeben.
Aus irgendeinem Grund wurde die Datei nicht ausgegeben. .. Ich habe versucht, einen Weg zu finden, um es mit Anmerkungen zu lösen, aber es hat nicht funktioniert. ..
Ich konnte nicht anders, also entschied ich mich, es direkt auf "Bean" zu setzen. ..
UserRegion.java
package spring.geode.geodeCommon.region;
import java.io.File;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.Region;
import org.springframework.data.gemfire.ReplicatedRegionFactoryBean;
import spring.geode.geodeCommon.listener.UserRegionListener;
import spring.geode.geodeCommon.model.User;
/**
*Benutzer verwalten{@link Region}Einstellungen erstellen für
*
*/
public class UserRegion {
/**
* {@link Region}Erschaffen
* @param cache
* @return
*/
public Region<Integer, User> createUserRegion(final GemFireCache cache) {
return cache.<Integer, User>getRegion("Users");
}
/**
* {@link Region}Nehmen Sie Einstellungen für vor
* @param cache
* @return
*/
public ReplicatedRegionFactoryBean<Integer, User> createUserRegionFactory(GemFireCache cache) {
ReplicatedRegionFactoryBean<Integer, User> replicatedRegionFactory = new ReplicatedRegionFactoryBean<>();
UserRegionListener[] listeners = { new UserRegionListener() };
listeners[0] = new UserRegionListener();
replicatedRegionFactory.setCacheListeners(listeners);
replicatedRegionFactory.setClose(false);
replicatedRegionFactory.setCache(cache);
replicatedRegionFactory.setRegionName("Users");
replicatedRegionFactory.setPersistent(true);
return replicatedRegionFactory;
}
/**
* {@link Region}Legen Sie die Dateipersistenz für fest
* @param cache
* @param regionFactory
* @return
*/
public ReplicatedRegionFactoryBean<Integer, User> configDiskStore(GemFireCache cache,
ReplicatedRegionFactoryBean<Integer, User> regionFactory) {
File[] files = { new File("/hoge/fuga/SpringGeode/persistenceFile") };
cache.createDiskStoreFactory()//
.setAllowForceCompaction(true)//
.setAutoCompact(true)//
.setDiskDirs(files)//
.create("SimpleDiskStore");
regionFactory.setDiskStoreName("SimpleDiskStore");
return regionFactory;
}
}
Die Persistenzeinstellung erfolgt über die Methode configDiskStore
.
Ein DiskStore
wird in Cache
erstellt und Einstellungen für verschiedene Persistenzmethoden und Persistenzdateipfade werden festgelegt.
Durch Aufrufen dieser Methode in der Anwendung und Registrieren der Bean wird die Persistenz endgültig abgeschlossen.
GeodeServerApplication.java
package spring.geode.server.geodeServer;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.Region;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.gemfire.ReplicatedRegionFactoryBean;
import org.springframework.data.gemfire.config.annotation.EnableLocator;
import org.springframework.data.gemfire.config.annotation.EnableManager;
import org.springframework.data.gemfire.config.annotation.PeerCacheApplication;
import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;
import spring.geode.geodeCommon.model.User;
import spring.geode.geodeCommon.region.UserRegion;
import spring.geode.server.geodeServer.repository.UserRepository;
@SpringBootApplication
@PeerCacheApplication(name = "SpringGeodeServerApplication", locators = "localhost[40404]")
@EnableGemfireRepositories(basePackageClasses = UserRepository.class)
public class GeodeServerApplication {
public static void main(String[] args) {
SpringApplication.run(GeodeServerApplication.class, args);
}
@Configuration
@EnableLocator(port = 40404)
@EnableManager(start = true)
static class LocatorManagerConfiguration {
}
@Configuration
static class CacheInitializer {
@Bean
Region<Integer, User> userRegion(final GemFireCache cache) {
return new UserRegion().createUserRegion(cache);
}
@Bean
public ReplicatedRegionFactoryBean<Integer, User> replicatedRegion(GemFireCache cache) {
UserRegion region = new UserRegion();
return region.configDiskStore(cache, region.createUserRegionFactory(cache));
}
}
}
Mit dieser Option können Sie die Persistenzeinstellung für jede Region festlegen. Wenn Sie die Anwendung starten, können Sie die Daten aus der in DiskStore festgelegten Datei laden und im Cache registrieren.
Ich wollte es schnell mit Anmerkungen implementieren, aber ich bedauere, dass es nicht funktioniert hat. .. Sollte ich die "ReplicatedRegionFactoryBean" nicht selbst anpassen? ..
Wie auch immer, es ist gut, weil es dauerhaft gemacht werden kann.
Ich würde mich freuen, wenn ich RDB als Persistenzziel festlegen könnte, aber ich konnte nicht die Information erhalten, dass "SpringDataGeode" eine solche Funktion bereitstellen würde. Deshalb habe ich die Dateipersistenzfunktion einmal verwendet, um sie persistent zu machen. Sah.
Recommended Posts