sobota, 11 września 2010

Oracle Coherence - działający przykład

Po krótkim wstępie do Oracle Coherence, czas uruchomić prosty przykład z użyciem Javy. Coherence jest dość duży i wymagane jest wprowadzenie w wiele rzeczy zanim będzie można go sprawnie używać, jednak mam nadzieje, że uda mi się wszystko opisać w miarę kolejnych wpisów. Jak na razie zróbmy sobie prosty przykład bez używania konsoli ;-)

Projekt Javy można utworzyć w dowolnym IDE.Ważne tylko aby dodać do niego bibliotekę coherence.jar z paczki pobranej ze strony Oracle.
Zacznijmy od stworzenia klasy która będzie przechowywana w klastrze Coherence. Niech to będzie wałkowany wszędzie pracownik.
Employee.java:
package pl.lstachowiak.coherence.example1;

import java.io.Serializable;
import java.math.BigDecimal;

public class Employee implements Serializable, Comparable {

 private int id;
 private String name;
 private String surname;
 private BigDecimal salary;
 private String city;

 public Employee() {
 }

 public Employee(int id, String name, String surname,
     BigDecimal salary, String city) {
  this.id = id;
  this.name = name;
  this.surname = surname;
  this.salary = salary;
  this.city = city;
 }

 public String getCity() {
  return city;
 }

 public void setCity(String city) {
  this.city = city;
 }

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

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

 public BigDecimal getSalary() {
  return salary;
 }

 public void setSalary(BigDecimal salary) {
  this.salary = salary;
 }

 public String getSurname() {
  return surname;
 }

 public void setSurname(String surname) {
  this.surname = surname;
 }

 @Override
 public String toString() {
  return "Employee{" + "id=" + id + " name=" + name + " surname="
    + surname + " salary=" + salary + " city=" + city + '}';
 }

 public int compareTo(Object o) {
  Employee other = (Employee) o;
  if (id > other.id) {
   return 1;
  } else if (id < other.id) {
   return -1;
  } else {
   return 0;
  }
 }
}
Jak widać klasa nie różni się niczym w stosunku to standardowych klas typu POJO. Jedyne co zostało dodane to implementacja interfejsu Serializable, ponieważ obiekt będzie przesyłany przez sieć oraz Comparable, żeby było po czym sortować, gdy będzie to potrzebne.
Napomnę tutaj, że Coherence wprowadził swój własny format serializacji obiektów. Jest od  bardziej wydajny, a obiekty po serializacji mniejsze. Więcej o tym w jednym z kolejnych wpisów.

Operacje na Coherence przeprowadźmy w metodzie main...
CoherenceExample1.java:
package pl.lstachowiak.coherence.example1;

import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Set;

public class CoherenceExample1 {

    public static void main(String[] args) {
  // #1
        NamedCache employees = CacheFactory.getCache("employees");

  // #2
  employees.put(1, new Employee(1, "John", "Travolta", new BigDecimal(300000.0), "New York"));
  employees.put(2, new Employee(2, "Jason", "Statham", new BigDecimal(550000.0), "Chicago"));
  employees.put(3, new Employee(3, "Sylvester", "Stalone", new BigDecimal(600000.0), "Miami"));
  employees.put(4, new Employee(4, "Bruce", "Willis", new BigDecimal(780000.0), "Los Angeles"));
  employees.put(5, new Employee(5, "Chuck", "Norris", new BigDecimal(1300000.0), "Kansas"));
  employees.put(6, new Employee(6, "Steven", "Seagal", new BigDecimal(20100.0), "Lansing"));

  // #3
  System.out.println("Pracownik o ID=1: " + employees.get(1));
  System.out.println("Rozmiar cache: " + employees.size());
  System.out.println("Usuwam: " + employees.remove(5));
  System.out.println("Rozmiar cache: " + employees.size());

  // #4
  Set<Map.Entry> entries = employees.entrySet();
  for (Map.Entry entry : entries) {
   System.out.println(entry.getKey() + ": " + entry.getValue());
  }
    }
}
#1 - pierwszym co trzeba zrobić to uzyskać referencję do Cache w którym będą przechowywane obiekty pracowników. CacheFactory odpowiada za jego stworzenie jeśli nie istnieje i zwrócenie referencji. Obiekt zwracany jest typu NamedCache, który implementuje standardowy interfejs Map z biblioteki Javy.
2# - umieszczanie elementów jest bardzo proste, zwykły put na mapie.
3# - podobnie wszystkie operacje pobierania oraz usuwania, wszystko bardzo intuicyjne
4# - można też pobrać całą listę obiektów w cache. Metoda entrySet() występuję w kilku wersjach, można jest podać także filtr oraz komparator jeśli szukamy odpowiedniego podzbioru obiektów w cache.

Po uruchomieniu powinno nam się pojawić coś podobnego do poniższego ekranu:
Chciałbym tutaj zwrócić uwagę, że nie napisałem nic o uruchamianiu węzła Coherence przed odpalaniem aplikacji. Pomimo tego wszystko działa! Jest tak ponieważ domyślnie aplikacja którą stworzyliśmy automatycznie staje się pełnoprawnym węzłem w klastrze. Często jest to niepożądane zachowanie i można tego uniknąć poprzez uruchomienie jej z parametrem:
-Dtangosol.coherence.distributed.localstorage=false
co prawda nadal aplikacja będzie pełnoprawnym węzłem w klastrze, ale nie będzie przechowywać danych;) Wymagany jest wtedy co najmniej jeden węzeł to robiący aby uniknąć wyjątków po uruchomieniu.

Brak komentarzy:

Prześlij komentarz