Zwischenspeichern von Daten mit Spring Data GemFire

In meinem vorherigen Tutorial habe ich den Zugriff auf Daten mit Spring Data GemFire ​​erläutert. GemFire ​​ist das In-Memory-Datensystem, das in verteilten Umgebungen verwendet wird. Die Leistung und Skalierbarkeit, die GemFire ​​durch die Verwendung effizienter Caching-Techniken zur Speicherung im In-Memory erreicht. In diesem Tutorial erkläre ich den Zweck, indem Verbindungen für http://themoneyconverter.com/ hergestellt werden, um RSS-Feeds für verschiedene Länder zu übertragen. Danach sollte die verstrichene Zeit berechnet werden, indem die Endzeit von der Startzeit abgezogen wird.

Lesen Sie auch:

  • Spring Data JPA
  • Spring Data JPA + Querydsl
  • Spring Data + MongoDB

1. Geschäftsszenario

Um sicherzustellen, dass das Spring GemFire-Framework eine geeignete Lösung für den Cache bereitstellt, haben wir eine MoneyRSS-Spring-Bean erstellt, die eine enthält LoadRss Dienst, der ein Land als Enum-Wert akzeptiert. Anschließend wurde eine HTTP-Verbindung zum Lesen des RSS für das angegebene Land geöffnet. Die Implementierung der gesamten Bean ist unten aufgeführt:

MoneyRSS.java

package net.javabeat.springdata.data;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

@Component
public class MoneyRSS {
	@Cacheable("moneyRss")
	public Object loadRss(Country country){
		try {
			URL url = new URL("http://themoneyconverter.com/rss-feed/"+country.code+"/rss.xml");
			try {
				return url.openConnection().getContent();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static enum Country {
		INDIA("INDIA","INR"), UK("United Kingdom","GBP"), USA("United States","USD");

		Country(String name, String code){
			this.code = code;
		}

		private String code;
		private String name;

		public String getCode() {
			return code;
		}

		public void setCode(String code) {
			this.code = code;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

	}
}

2. Spring Bean-Konfigurationen

Es handelt sich um die Spring-Container-Konfigurationsdatei, die zum Definieren von Spring Beans, Repositorys (falls vorhanden), GemFire-Cache, Regionen, Cache-Managern usw. verwendet wird.

SpringContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:gfe-data="http://www.springframework.org/schema/data/gemfire"
	xmlns:gfe="http://www.springframework.org/schema/gemfire"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/data/gemfire http://www.springframework.org/schema/data/gemfire/spring-data-gemfire.xsd http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd">
	<!-- Search for spring components -->
	<context:component-scan base-package="net.javabeat"></context:component-scan>
	<!-- Declare GemFire Cache -->
	<gfe:cache/>
	<!-- Local region for being used by the Message -->
	<gfe:local-region id="moneyRss"/>
	<!-- It's mandatory for enabling the Cache -->
	<bean id="cacheManager"   p:cache-ref="gemfireCache"/>
	<!-- Dummy Bean for EnableCaching -->
	<bean id="enableCachingBean"  ></bean>
</beans>

3. Maven-Build-Datei

Es handelt sich um die Maven-Build-Datei, die die erforderlichen Bibliotheken enthält, um das Beispiel zum Laufen zu bringen.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>net.javabeat.springdata</groupId>
	<artifactId>SpringData-GemFire-Cache</artifactId>
	<version>1.0</version>
	<packaging>jar</packaging>

	<name>Spring Data</name>
	<!-- Just for including the Spring framework necessary libraries inone shot -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.0.2.RELEASE</version>
	</parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-gemfire</artifactId>
			<version>1.3.4.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>com.gemstone.gemfire</groupId>
			<artifactId>gemfire</artifactId>
			<version>7.0.1</version>
		</dependency>
		<!-- Google List API -->
		<dependency>
			<groupId>com.google.collections</groupId>
			<artifactId>google-collections</artifactId>
			<version>1.0</version>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>http://repo.spring.io/libs-snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>gemstone</id>
			<url>http://dist.gemstone.com.s3.amazonaws.com/maven/release/</url>
		</repository>
	</repositories>

	<pluginRepositories>
		<pluginRepository>
			<id>spring-snapshots</id>
			<name>Spring Snapshots</name>
			<url>http://repo.spring.io/libs-snapshot</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>

</project>

4. Spring Data GemFire-Beispielanwendung

Es handelt sich um die Spring Data GemFire-Beispielanwendung, die zum Starten des Spring-Frameworks und zum Initiieren einer RSS-HTTP-Anfrage mithilfe von GemFireBean verwendet wird.

Ausführbare Datei.java

package net.javabeat.springdata.executable;

import net.javabeat.springdata.bean.GemFireBean;
import net.javabeat.springdata.data.MoneyRSS;

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

@EnableCaching
public class Executable {
	// Getting spring context
	public static ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new ClassPathResource(&quot;SpringContext.xml&quot;).getPath());

	// GemFireBean declaration, it's just a normal spring bean
	public static GemFireBean gfb;

	public static void main(String() args) {
		// Acquiring the GemFireBean
		gfb = (GemFireBean)context.getBean(&quot;gemFireBean&quot;);
		loadAndTimeIt(1,gfb,MoneyRSS.Country.INDIA);
		loadAndTimeIt(2,gfb,MoneyRSS.Country.INDIA);
		loadAndTimeIt(3,gfb,MoneyRSS.Country.INDIA);
		loadAndTimeIt(1,gfb,MoneyRSS.Country.USA);
		loadAndTimeIt(2,gfb,MoneyRSS.Country.USA);
		loadAndTimeIt(3,gfb,MoneyRSS.Country.USA);
		loadAndTimeIt(1,gfb,MoneyRSS.Country.UK);
		loadAndTimeIt(2,gfb,MoneyRSS.Country.UK);
		loadAndTimeIt(3,gfb,MoneyRSS.Country.UK);
	}

	private static void loadAndTimeIt(int tryIndex,GemFireBean bean,MoneyRSS.Country country){
		// Start Time
		long start = System.currentTimeMillis();
		// Load document
		Object o = gfb.getMoneyRss().loadRss(country);
		// End Time Computation
		long elapsed = System.currentTimeMillis() - start;
		// Print out the time message
        System.out.println("Try # :: "+tryIndex+" :: For :: "+country+" :: Found " + o + ", and it only took " + elapsed + " ms to find out!\n");
	}
}

5. GemFire ​​Cache-Demo

Es ist die Demonstration der Verwendung von GemFire ​​zum Zwischenspeichern der Anfrage. Diese Ausgabe zeigt, wie viel Zeit für jede Anfrage benötigt wurde. Wenn man es genau betrachtet, hat das erste Nachschlagen der Daten länger gedauert, bei späteren Anfragen geht es aber viel schneller. Es zeigt, dass GemFire ​​eine gute Option zum Ausprobieren sein könnte, wenn Sie Leistungsprobleme beim Abrufen der Daten haben.


(info 2014/05/24 01:00:24.765 EEST  &lt;main&gt; tid=0x1) Defaulting license-working-dir to current working directory &quot;D:\Krishna\EclipseLink\Workspace\SpringData-GemFire-Cache&quot;.

(info 2014/05/24 01:00:24.775 EEST  &lt;main&gt; tid=0x1) Acquiring default evaluation license.

(info 2014/05/24 01:00:26.554 EEST  &lt;main&gt; tid=0x1) vFabric Licensing Client activation of license required 1778 milliseconds.

(info 2014/05/24 01:00:26.618 EEST  &lt;main&gt; tid=0x1) Using the default evaluation license.

(info 2014/05/24 01:00:26.619 EEST  &lt;main&gt; tid=0x1) Licensing required 1856 milliseconds.

(info 2014/05/24 01:00:26.758 EEST  &lt;main&gt; tid=0x1) GemFire P2P Listener started on  tcp:///192.168.1.100:59267

(info 2014/05/24 01:00:30.966 EEST  &lt;main&gt; tid=0x1) Membership: lead member is now mohammad-amr-lt:49779

(config 2014/05/24 01:00:30.974 EEST  &lt;main&gt; tid=0x1) This member, mohammad-amr-lt:49779, is becoming group coordinator.

(info 2014/05/24 01:00:31.011 EEST  &lt;main&gt; tid=0x1) Entered into membership in group GF70 with ID mohammad-amr-lt:49779.

(info 2014/05/24 01:00:31.013 EEST  &lt;main&gt; tid=0x1) Starting DistributionManager mohammad-amr-lt:49779.

(info 2014/05/24 01:00:31.014 EEST  &lt;main&gt; tid=0x1) Initial (membershipManager) view =  (mohammad-amr-lt:49779{lead})

(info 2014/05/24 01:00:31.015 EEST  &lt;main&gt; tid=0x1) Admitting member &lt;mohammad-amr-lt:49779&gt;. Now there are 1 non-admin member(s).

(info 2014/05/24 01:00:31.015 EEST  &lt;main&gt; tid=0x1) mohammad-amr-lt:49779 is the elder and the only member.

(info 2014/05/24 01:00:31.130 EEST  &lt;main&gt; tid=0x1) Did not hear back from any other system. I am the first one.

(info 2014/05/24 01:00:31.130 EEST  &lt;main&gt; tid=0x1) DistributionManager mohammad-amr-lt:49779 started on 239.192.81.1(10334). There were 0 other DMs. others: ()

(info 2014/05/24 01:00:31.153 EEST  &lt;Thread-3 StatSampler&gt; tid=0x21) Disabling statistic archival.

(info 2014/05/24 01:00:31.394 EEST  &lt;main&gt; tid=0x1) Initializing region _monitoringRegion_mohammad-amr-lt49779

(config 2014/05/24 01:00:31.422 EEST  &lt;main&gt; tid=0x1) Command Service could not be initialized. Could not find Spring Shell library which is needed for CLI/gfsh in classpath. Internal support for CLI &amp; gfsh is not enabled.

(info 2014/05/24 01:00:31.477 EEST  &lt;main&gt; tid=0x1) Initializing region PdxTypes
Try # :: 1 :: For :: INDIA :: Found sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@629a99eb, and it only took 741 ms to find out!

Try # :: 2 :: For :: INDIA :: Found sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@629a99eb, and it only took 3 ms to find out!

Try # :: 3 :: For :: INDIA :: Found sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@629a99eb, and it only took 0 ms to find out!

Try # :: 1 :: For :: USA :: Found sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@2af4ca49, and it only took 685 ms to find out!

Try # :: 2 :: For :: USA :: Found sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@2af4ca49, and it only took 1 ms to find out!

Try # :: 3 :: For :: USA :: Found sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@2af4ca49, and it only took 0 ms to find out!

Try # :: 1 :: For :: UK :: Found sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@64ad97f5, and it only took 599 ms to find out!

Try # :: 2 :: For :: UK :: Found sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@64ad97f5, and it only took 1 ms to find out!

Try # :: 3 :: For :: UK :: Found sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@64ad97f5, and it only took 0 ms to find out!

(info 2014/05/24 01:00:33.729 EEST  &lt;Distributed system shutdown hook&gt; tid=0xa) VM is exiting - shutting down distributed system

6. Zusammenfassung

Sie haben gerade eine Anwendung entwickelt, die die GemFire-Cache-Funktion verwendet. Das hier bereitgestellte Beispiel stellt mehrere Anfragen zum Abrufen der RSS-Geld-Feeds für verschiedene Länder dar, wobei die erste Anfrage für jedes einzelne Land im Vergleich zur zweiten und dritten Anfrage lange dauerte.

Laden Sie den Quellcode herunter

(wpdm_file id=103)

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen