Business Delegate Tasarım Şablonu KurumsalJava.com

Benzer belgeler
Facade (Cephe) Tasarım Şablonu KurumsalJava.com

Intercepting Filter Tasarım Şablonu KurumsalJava.com

Chain of Responsibility Tasarım Şablonu KurumsalJava.com

Decorator Tasarım Şablonu

Loose Coupling (LC) Esnek Bağ Tasarım Prensibi KurumsalJava.com

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

Proxy (Vekil) Tasarım Şablonu KurumsalJava.com

Adapter Tasarım Şablonu

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Front Controller Tasarım Şablonu KurumsalJava.com

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

Open Closed Principle (OCP) Açık Kapalı Tasarım Prensibi KurumsalJava.com

.com. Özcan Acar 2009 Kurumsal Java.com

Flyweight (Sinek Siklet) Tasarım Şablonu KurumsalJava.com

Builder Tasarım Şablonu KurumsalJava.com

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

BİL-141 Bilgisayar Programlama I (Java)

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

.com. Kurumsal Java. Özcan Acar com

İçindekiler. Okuma lisansı info acar, için verilmiştir. Çoğaltılması ve dağıtılması yasaktır.

BİL132 Bilgisayar Programlama II

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

2. Bölüm Spring İle Tanışalım

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

.com. Özcan Acar 2009 Kurumsal Java.com

Klavyeden Basit Giriş/Çıkış İşlemleri

Java Interface ve Abstract Sınıflar

Java EE 5 Teknolojileri Jboss Seam

JBoss Seam. Melih Sakarya

Dağıtık Sistemler CS5001

Spring Framework Eğitimi

Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

BİL-141 Bilgisayar Programlama I (Java)

Bire-bir Sahiplik İlişkisi ile İlgili Sorular:

Test Güdümlü Yazılımın Tasarım Üzerindeki Etkileri KurumsalJava.com

«BM364» Veritabanı Uygulamaları

Üst Düzey Programlama

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

Spring Framework Eğitimi

ECLIPSE PROGRAMININ ÇALIŞTIRILMASI

BM208- Nesneye Dayalı Analiz ve Tasarım. Sunum 7

7. HAFTA. Erişim Belirleyiciler

ORM & Hibernate. Ahmet Demirelli. SCJP 5.0, SCWCD 1.4 ahmetdemirelli@sabanciuniv.edu

Kılgıladığı arayüzler: Serializable, Cloneable, Map<K,V>, NavigableMap<K,V>, SortedMap<K,V>

Client Server Database

JBoss Seam Next Generation Integration Framework

RSA ANAHTAR DAĞITIMI VE RSA İLE DİJİTAL İMZA OLUŞTURMA

Sunum İçeriği. Programlamaya Giriş

Spring Framework. KurumsalJava.com KurumsalJavaAkademisi.com. Özcan Acar Bilgisayar Mühendisi

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

İlgili Konular: Object.equals(java.lang.Object), Object.hashCode(), rehash(), Collection, Map, HashMap, TreeMap, Serialized Form

Cahit GÜNGÖR Hacettepe Üniversitesi Bilişim Enstitüsü. Sorumluluk Zinciri. Kod Üretme (Code Generation)

Class LinkedHashMap. Class LinkedHashMap java.lang.object java.util.abstractmap java.util.hashmap java.util.linkedhashmap. Kılgıladığı arayüzler:

Kitapta UML diyagramları kullanılarak, tasarım şablonları görsel olarak açıklanmıştır. İçerik aşağıdaki bölümlerden oluşmaktadır:

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

PAKET ERİŞİMLERİ SINIFLARIN YENİDEN KULLANIMI. BMU-112 Algoritma ve Programlama-II Yrd. Doç.Dr. İlhan AYDIN

Üst Düzey Programlama

Özcan Acar 2010 Kurumsal Java Akademisi.com

Burak Kıymaz JAVA FX

// hataları işaret eden referans

NESNEYE DAYALI PROGRAMLAMA 9. HAFTA UYGULAMA DERSİ

Java Class Yapısında Finalize Metotunun Kullanımı

public static int Toplam int x, int y

Nesneye yönelik: Javada herşey bir nesnedir. Java nesne yönelimli olduğu için kolayca geliştirilebilir.

Nesne Yönelimli Programlama

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Java EE web uygulamaları geliştirmek için kullanılan açık kaynak web uygulama framework üdür.

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 12: Grafik Kullanıcı Arayüzü (Graphical User Interface-GUI)

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015

BMH-303 Nesneye Yönelik Programlama

Listview Kullanımı. Aşağıdaki örnekte bir ListView'ı birkaç ülke ismiyle dolduracağız.

JAVA RMI ve Hibernate teknolojileri kullanılarak çok amaçlı bir yazılım altyapısı hazırlanması

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

1. Bölüm Spring'e Giriş

Spring Application Framework Harezmi Bilişim Çözümleri

Şablon Türler (Generics)

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 8. Yrd.Doç.Dr.Hacer Karacan

Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Tasarım Prensipleri. KurumsalJava.com. Özcan Acar Bilgisayar Mühendisi

MOBIL UYGULAMA GELIŞTIRME

Ders 8 Konu Özeti ve Problemler

Java da, tüm değişkenlerin kullanılmadan önce tanımlanması edilmesi gerekir. Bir değişken tanımlamanın temel gösterimi bu şekildedir:

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

Bir c sınıfının doğal sıralaması ile tutarlı olması (be consistent with equals) demek, c sınıfı içindeki her e1 ve e2 nesnesi için

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

Spring Security Framework Harezmi Bilişim Çözümleri

Java String İşlemleri

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 8: Sınıf (Class) Yapılarına Giriş

Kapsülleme ( Encapsulation ) BBS-515 Nesneye Yönelik Programlama

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

Transkript:

Business Delegate Tasarım Şablonu KurumsalJava.com Özcan Acar Bilgisayar Mühendisi http://www.ozcanacar.com

Modern yazılım sistemleri birden fazla katmandan oluşur. Bu katmanlar her zaman aynı server üzerinde mevcut olmayabilir. Bu durumda bir katmandan diger katmana ulaşmak için remote call olarak isimlendirilen RMI 1 operasyonları yapılır. Örneğin EJB teknolojisi ile hazırlanan komponentler birden fazla server üzerinde hizmet sunabilir. Bu komponentlere bağlanıp, işlem yapabilmek için RMI kullanılır. EJB sistemlerinde bazı işlemler bilgisayar ağı üzerinden erişim gerektirebileceği için, zamanla sistem performansı negatif etkilenebilir. Bunun yanısıra gösterim katmanında bulunan sınıflar direk EJB komponentler ile interaksiyona girdikleri taktirde, gösterim katmanı ile EJB lerden oluşan İşletme (business) katmanı arasında sıkı bir bağ oluşur. EJB komponentler üzerinde yapılan değişiklikler gösterim katmanını etkiler. Bu bağı azaltmak ve RMI performansını artırmak için Business Delegate tasarım şablonu kullanılır. Business Delegate tasarım şablonu ile, kompleks yapıda olabilecek işletme katmanı ile gösterim katmanı arasına, gösterim katmanının isteklerini işletme katmanına delege edecek BusinessDelegate isminde bir sınıf yerleştirilir. Bu sınıfın öncelikli görevi, işletme katmanında yer alan EJB komponentlerin lokalizasyonu için gerekli lookup işlemlerini gösterim katmanı için transparen hale getirmektir. Bu işlem için BusinessDelegate, Service Locator tasarım şablonundan faydalanır. Bunun yanısıra BusinessDelegate İşletme katmanında oluşan tüm hataları (exception handling) yakalayarak, gösterim katmanı için daha anlaşılır bir hale getirir. Örneğin EJB komponentleri ile çalışırken java.rmi.remoteexception oluşabilir. Gösterim katmanının catch(remoteexception) şeklinde oluşan remote hataları yakalamaya çalışması, gösterim katmanını EJB teknolojisine bağımlı kılar. BusinessDelegate kullanıldığı taktirde, servis katmanı ile gösterim katmanı arasında loose coupling olarak tabir edilen esnek bir bağ oluşur. Business Delegate tasarım şablonunun beraberinde getirdiği diğer bir avantaj ise, bir caching (hızlı önbellek) mekanızması kullanarak ağ (network) üzerinden yapılan işlemlerin neticelerini saklamak ve tekrar RMI operasyonuna gerek kalmadan gösterim katmanı tarafından kullanılmasını sağlıyor olmasıdır. Gerekli verilerin RMI üzerinden başka bir 1 Remote Method Invocation. Bakınız: http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp

serverden edinilmesi yerine BusinessDelegate sınıfının sahip olduğu caching sisteminden alınması, sistem performansını büyük ölçüde artırır. Uml diagramında da görüldüğü gibi BusinessDelegate sınıfı Service Locator tasarım şablonunu kullanarak, işletme katmanında bulunan EJB ve diğer servis veren sınıfların lokalize eder. Business Delegate tasarım şablonunun nasıl kullanılabileceğini bir EJB örneğinde görelim. İlk işlem olarak EJB komponentini oluşturuyoruz. package org.javatasarim.pattern.businessdelegate.ejb; import javax.ejb.stateless; Stateless EJB komponenti. @author Oezcan Acar @Stateless public class ServiceBean implements ServiceBeanRemote public String getvalue() return "value"; Servis sunucusu olan ServiceBean stateless tipi bir EJB komponentidir. @Stateless annotasyonu kullanılarak herhangi bir java sınıfı stateless komponent olarak tanımlanabilir. ServiceBean sınıfı bünyesinde bulunan getvalue() metodu, gösterim katmanı tarafindan kullanılacak olan metoddur. Bir EJB komponente RMI üzerinden ulaşabilmek için bir Remote Interface sınıfının tanımlanması gerekmektedir: package org.javatasarim.pattern.businessdelegate.ejb; import java.io.serializable; import javax.ejb.remote; Service için remote interface sinifi. @author Oezcan Acar @Remote public interface ServiceBeanRemote extends Serializable public String getvalue(); EJB komponenti kullanmak isteyen bir sınıf, ServiceBeanRemote interface sınıfını implemente eden bir stub nesne edinmek zorundadır. Bu stub nesne, EJB komponentin deploy

edildiği Container tarafından (Jboss, Weblogic vs...) otomatik olarak oluşturulur. Bu stub nesnesini proxy 2 olarak düşünebilirsiniz. Container tarafından oluşturulan bu proxy otomatik olarak bizim sunduğumuz ServiceBeanRemote interface sınıfını implemente eder. Kullanıcı sınıf bu proxy nesnesinin getvalue() metodunu kullandığı zaman, proxy bu isteği gerçek EJB komponentine yönlendirir. @Remote annotasyonunu kullanarak, herhangi bir interface sınıfını EJB Remote Interface haline getirebiliriz. Şimdi Business Delegate tasarım şablonun uygulandığı BusinessDelegate sınıfını inceliyelim: package org.javatasarim.pattern.businessdelegate; import org.javatasarim.pattern.businessdelegate.ejb. ServiceBeanRemote; Business Delegate Sinifi @author Oezcan Acar public class BusinessDelegate Kullanılan ejb komponenti private ServiceBeanRemote service; Konstruktör bünyesinde ServiceLocator sinifi kullanilarak ejb komponenti olusturuluyor. public BusinessDelegate() service = ServiceLocator.instance(). getservice("servicebean/remote"); getvalue() metodu ejb komponentine delege ediliyor. @return String value public String getvalue() return service.getvalue(); BusinessDelegate basit bir POJO 3 sınıftır. Gösterim katmanı tarafından gelen istekleri, EJB sınıfına delege edebilmesi için bünyesinde ServiceBeanRemote tipinde bir değişken barındırır. getvalue() metodunda görüldüğü gibi, EJB komponentin getvalue() metodunu kullanarak, gösterim katmanından gelen isteği EJB komponentine delege eder. Konstruktör içinde ServiceLocator kullanılarak, EJB remote interface nesnesinin nasıl oluşturulduğunu 2 Proxy tasarım sablonuna bakınız. 3 POJO - Plain Old Java Object: Basit bir Java sınıfı anlamında.

görmekteyiz. BusinessDelegate sınıfı, ServiceLocator aracılığıyla kullanmak istediği EJB komponenti lokalize eder. package org.javatasarim.pattern.businessdelegate; import java.util.hashmap; import java.util.map; import javax.naming.initialcontext; import javax.naming.namingexception; import org.javatasarim.pattern.businessdelegate.ejb. ServiceBeanRemote; Bir servisi lokalize etmek için kullanılan ServiceLocator komponenti @author Oezcan Acar public class ServiceLocator Olusturulan ejb remote interface nesnei cache içinde tutulur. Böylece her defasinda lookup işlemi yapilmak zorunda kalinmaz. private Map<String, ServiceBeanRemote> cache; private InitialContext ctx; Ssingleton tasarım Şablonunu kullanarak sistemde tek bir ServiceLocator olacak sekilde olusturuyoruz. private static ServiceLocator locator = new ServiceLocator(); private ServiceLocator() try Lookup için gerekli ctx ve remote interface nesnelerin tutuldugu cache nesnesini olusturuyoruz. ctx = new InitialContext(); cache = new HashMap<String, ServiceBeanRemote>(); catch (NamingException e) throw new RuntimeException(e); catch (Exception e) throw new RuntimeException(e);

public static ServiceLocator instance() return locator; Lookup ismi verilen bir EJB komponentini geri verir. @param lookup jndiname @return Service service public ServiceBeanRemote getservice(string lookup) ServiceBeanRemote remote = null; if(cache.containskey(lookup)) remote = (ServiceBeanRemote) cache.get(lookup); else try remote = (ServiceBeanRemote) ctx.lookup(lookup); cache.put(lookup, remote); catch (NamingException e) throw new RuntimeException(e); return remote; Bir EJB komponenti kullanabilmek için InitialContext sınıfı yardımıyla lookup işlemi yapılmak zorundadır. Bu bir nevi mahalleye gelen bir yabancının Ahmet beyin evini arıyorum, 35 nolu evde oturuyormuş söylemine eşittir. Lookup işlemi ile, ismi belli olan bir EJB komponent lokalize edilirek EJB nin sahip olduğu remote interface nesnesi elde edilir. ServiceLocator sınıfı EJB komponentini lokalize etmek için kullanılır. ServiceLocator lookup için gerekli tüm metodları ihtiva ettigi için, BusinessDelegate sınıfının spesifik lookup operasyonlar ile ugraşma zorunluğuğu ortadan kalkmaktadır. ServiceLocator bünyesinde bir cache oluşturarak, her defasından lookup işleminin yapılmasını engellemiş oluyoruz. Her lookup, RMI üzerinden başka bir servere bağlantı yapmak anlamına geldiği için, cache içinde bulunan bir remote interface nesnesini direk cacheden alıp kullanmak, performansı artıracaktır. ServiceLocator sınıfını Singleton Tasarım şablonunu kullanarak implemente ediyoruz, çünkü tüm sistem bünyesinde sadece bir ServiceLocator ve bununla bağlantılı olarak sadece bir cache in olması gerekmektedir.

package org.javatasarim.pattern.businessdelegate; Test sinifi @author Oezcan Acar public class Test Bu test sinifi sadece örnek olarak programlanmistir. EJB 3 komponent kullanildigi için, test sinifinin calismasi imkansizdir. Örneğin calistirilabilmesi için EJB komponentin JBOSS 4 gibi bir application server üzerinde deploy edilmesi gerekmektedir. public static void main(string[] args) BusinessDelegate delegate = new BusinessDelegate(); System.out.println(delegate.getValue()); Test.main() bünyesinde bir BusinessDelegate nesnesi oluşturarak, getvalue() metodunu kullanıyoruz. Gösterim katmanını simule eden Test sınıfı, EJB komponentin varlığından bile haberdar olmadan, servis katmanında yer alan bir EJB nin sunduğu servisi kullanabilmektedir. Eger Business Delegate tasarım şablonun kullanmasaydık, Test sınıfı aşağıdakı yapıda olurdu: package org.javatasarim.pattern.businessdelegate; import javax.naming.initialcontext; import org.javatasarim.pattern.businessdelegate.ejb. ServiceBeanRemote; public class Test public static void main(string[] args) InitialContext ctx = new InitialContext(); ServiceBeanRemote remote = (ServiceBeanRemote) ctx.lookup("servicebean/remote"); System.out.println(remote.getValue()); Böyle bir implementasyonun beraberinde getirdigi sorunlar şöyle olacaktır: Gösterim katmanı EJB teknolojine bağımlı olacaktır, çünkü RMI operasyonlarını kullanarak EJB komponenti lokalize etmek zorunda. Gösterim katmanı oluşacak javax.rmi.remoteexception ile başetmek zorundadır. Servere baglantı koptuğunda, tekrar baglantı kurmak zorundadır.

Gösterim katmanı caching uygulamadığı için, her getvalue() metodunu kullandığında, bu RMI üzerinden EJB komponentin deploy edildigi servere bağlantı kurmak anlamına geldigi için, yapılmak istenen işlemler uzun sürecek ve performans iyi olmayacaktır. Görüldüğü gibi Business Delegate tasarım şablonu ile hem servis sağlayan katman gösterim katmanı için daha transparen bir hale dönüştürülüyor, hemde RMI operasyonlarında performans artırılabiliyor. Business Delegate tasarım şablonu ne zaman kullanılır? EJB gibi teknolojiler kullandığında, gösterim katmanı ile işletme katmanı arasındaki bağlantı için Business Delegate kullanılır. Servis katmanında uluşan hataları, gösterim katmanı için daha anlaşılır bir hale dönüştürmek için Business Delegate kullanılır. RMI operasyonlarında performans çok önemli bir unsurdur. Business Delegate caching mekanizmaları implemente ederek, performansı artırır. İlişkili tasarım şanlonları: Business Delegate, servis katmanında bulunan komponentleri lokalize etmek için Service Locator tasarım şablonunu kullanır. Business Delegate bir nevi proxy nesnesi oluşturarak, gösterim katmanını, servis katmanı ile bir araya getirir. EOF (End Of Fun) Özcan Acar