client.xml - client cache file for access to the remote servers
<!DOCTYPE client-cache PUBLIC "-//GemStone Systems, Inc.//GemFire Declarative Caching 7//EN" "http://www.gemstone.com/dtd/cache7_0.dtd"> <client-cache> <!-- No cache storage in the client region because of the PROXY client region shortcut setting. --> <region name="departments"> <region-attributes refid="PROXY" pool-name="gfPool"/> </region> <region name="employees"> <region-attributes refid="PROXY" pool-name="gfPool" /> </region> </client-cache>
application-context.xml - spring application context file using spring gemfire. It's here where we make a connection to GemFire through a locator to load balance between the servers.
<?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:gfe="http://www.springframework.org/schema/gemfire" xmlns:gfe-data="http://www.springframework.org/schema/data/gemfire" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire-1.2.xsd http://www.springframework.org/schema/data/gemfire http://www.springframework.org/schema/data/gemfire/spring-data-gemfire-1.2.xsd"> <gfe:client-cache id="client-cache" cache-xml-location="classpath:client.xml" pool-name="gfPool"/> <gfe:pool id="gfPool" max-connections="10"> <gfe:locator host="localhost" port="10334"/> </gfe:pool> <gfe:lookup-region id="departments" name="departments" cache-ref="client-cache"/> <gfe:lookup-region id="employees" name="employees" cache-ref="client-cache"/> <gfe-data:repositories base-package="vmware.au.se.gf7.deptemp.repos" /> </beans>
Department.java - domain object with spring data repository annotation referencing "departments" region in gemFire
package vmware.au.se.gf7.deptemp.beans; import java.io.Serializable; import java.util.Properties; import org.springframework.data.annotation.Id; import org.springframework.data.gemfire.mapping.Region; import com.gemstone.gemfire.cache.Declarable; @Region("departments") public class Department implements Declarable, Serializable { private static final long serialVersionUID = -9097335119586059309L; @Id private int deptno; private String name; public void init(Properties props) { // TODO Auto-generated method stub this.deptno = Integer.parseInt(props.getProperty("deptno")); this.name = props.getProperty("name"); } public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Department [deptno=" + deptno + ", name=" + name + "]"; } }
Employee.java - domain object with spring data repository annotation referencing "employees" region in GemFire
package vmware.au.se.gf7.deptemp.beans; import java.io.Serializable; import java.util.Properties; import org.springframework.data.annotation.Id; import org.springframework.data.gemfire.mapping.Region; import com.gemstone.gemfire.cache.Declarable; @Region("employees") public class Employee implements Declarable, Serializable { private static final long serialVersionUID = -8229531542107983344L; @Id private int empno; private String name; private String job; private int deptno; public void init(Properties props) { // TODO Auto-generated method stub this.empno = Integer.parseInt(props.getProperty("empno")); this.name = props.getProperty("name"); this.job = props.getProperty("job"); this.deptno = Integer.parseInt(props.getProperty("deptno")); } public int getEmpno() { return empno; } public void setEmpno(int empno) { this.empno = empno; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } @Override public String toString() { return "Employee [empno=" + empno + ", name=" + name + ", job=" + job + ", deptno=" + deptno + "]"; } }
At this point we create two repositories as shown below.
DeptRepository.java
package vmware.au.se.gf7.deptemp.repos; import java.util.Collection; import org.springframework.data.gemfire.repository.Query; import org.springframework.data.repository.CrudRepository; import vmware.au.se.gf7.deptemp.beans.Department; public interface DeptRepository extends CrudRepository<Department, String> { Department findByName(String name); @Query("SELECT * FROM /departments") Collection<Department> myFindAll(); }
EmpRepository.java
package vmware.au.se.gf7.deptemp.repos; import java.util.Collection; import org.springframework.data.gemfire.repository.Query; import org.springframework.data.repository.CrudRepository; import vmware.au.se.gf7.deptemp.beans.Employee; public interface EmpRepository extends CrudRepository<Employee, String> { @Query("SELECT * FROM /employees where deptno = $1") Collection<Employee> empsInDeptno(int deptno); @Query("SELECT * FROM /employees") Collection<Employee> myFindAll(); }
Finally we have a Test client as follows.
package spring.gemfire.repository.test; import java.util.Collection; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import vmware.au.se.gf7.deptemp.beans.Department; import vmware.au.se.gf7.deptemp.beans.Employee; import vmware.au.se.gf7.deptemp.repos.DeptRepository; import vmware.au.se.gf7.deptemp.repos.EmpRepository; public class Test { private ConfigurableApplicationContext ctx = null; public Test() { ctx = new ClassPathXmlApplicationContext("application-context.xml"); } public void run() { DeptRepository deptRepos = (DeptRepository) ctx.getBean(DeptRepository.class); // get quick size System.out.println("** Size of dept repository **"); System.out.println("Size = " + deptRepos.count()); // call findOne crud method by key System.out.println("** calling deptRepos.findOne(\"20\") **"); Department dept = (Department) deptRepos.findOne("20"); System.out.println(dept); // call findOne crud method for an attribute System.out.println("** calling deptRepos.findByName(\"ACCOUNTING\") **"); Department dept2 = (Department) deptRepos.findByName("ACCOUNTING"); System.out.println(dept2); // call my own findAll Collection<Department> deps = (Collection<Department>) deptRepos.myFindAll(); System.out.println("\n** All Departments using -> deptRepos.myFindAll()"); System.out.println("Defined as : @Query(\"SELECT * FROM /departments\") "); System.out.println("Collection<Department> myFindAll(); ** "); for (Department d: deps) { System.out.println(d.toString()); } EmpRepository empRepos = (EmpRepository) ctx.getBean(EmpRepository.class); // get quick size System.out.println("** Size of emp repository **"); System.out.println("Size = " + empRepos.count()); Collection<Employee> emps = empRepos.empsInDeptno(40); System.out.println("\n ** All Employees in dept 40 using -> Collection<Employee> empsInDeptno(int deptno) **"); for (Employee e: emps) { System.out.println(e.toString()); } } /** * @param args * @throws InterruptedException */ public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); t.run(); System.out.println("all done.."); } }
Output is as follows
[info 2012/11/22 16:39:03.626 EST
[config 2012/11/22 16:39:03.628 EST
** Size of dept repository **
Size = 4
** calling deptRepos.findOne("20") **
Department [deptno=20, name=RESEARCH]
** calling deptRepos.findByName("ACCOUNTING") **
Department [deptno=10, name=ACCOUNTING]
** All Departments using -> deptRepos.myFindAll()
Defined as : @Query("SELECT * FROM /departments")
Collection
Department [deptno=30, name=SALES]
Department [deptno=40, name=OPERATIONS]
Department [deptno=10, name=ACCOUNTING]
Department [deptno=20, name=RESEARCH]
** Size of emp repository **
Size = 13
** All Employees in dept 40 using -> Collection
Employee [empno=7380, name=BLACK, job=CLERK, deptno=40]
Employee [empno=7381, name=BROWN, job=SALESMAN, deptno=40]
Employee [empno=7373, name=SIENA, job=CLERK, deptno=40]
all done..
For more information see the link below.
http://static.springsource.org/spring-gemfire/docs/current/reference/html/gemfire-repositories.html
No comments:
Post a Comment